首页 > 试题广场 >

与7无关的数

[编程题]与7无关的数
  • 热度指数:37093 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
一个正整数,如果它能被7整除,或者它的十进制表示法中某个位数上的数字为7, 则称其为与7相关的数.现求所有小于等于n(n<100)的与7无关的正整数的平方和。

输入描述:
案例可能有多组。对于每个测试案例输入为一行,正整数n,(n<100)


输出描述:
对于每个测试案例输出一行,输出小于等于n的与7无关的正整数的平方和。
示例1

输入

21

输出

2336
下列算法可以适用于任意n值,不局限于两位数。
#include<iostream>
#include<cstdio>
using namespace std;
int isnumber(int x){
	if(x%7==0){//若x可被7整除,返回0值;
		return 0;}
	else {
		int digit,j=x;
		while(j!=0){
			digit=j%10;//取最低位数值
			if(digit!=7){
				j=j/10;//若最低位数值不为7,令j为高位,再循坏取j的最低位数值。
			}			
			else {
				return 0;//若某一位上数值为7,返回0;
			}		
		}
    return x*x;	//所有位上的数都不为7,返回x的平方;
	}	
}
int main(){
	int i,n,sum=0;
	scanf("%d",&n);
	for(i=1;i<=n;++i){
		sum+=isnumber(i);
	}		
		printf("%d",sum);	
return 0;
}


编辑于 2021-01-12 14:29:28 回复(0)
先加非7倍数的平方和,再减个位和十位为7的数平方和,注意既是7的倍数,也是个位数为7的数(7)
#include<iostream>
#include<cstring>
using namespace std;
int main() {
	int n;
	cin >> n;
	int sum = 0;
	for (int i = 1; i <= n; i++) {
		if ((i % 7 != 0))
			sum += i*i;
		if (i % 10 == 7&&i>7)
			sum -= i*i;
		if (i / 10 == 7)
			sum -= i*i;
	}
	cout << sum << endl;
	return 0;
}

发表于 2020-02-15 22:48:23 回复(0)
#include<bits/stdc++.h>
int main(){
    int n,a[101]={0};
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<=n;i++)
            if((i/10) != 7 && (i%10) != 7 && (i%7) != 0)
                a[i]=i*i;
        for(int i=0;i<=n;i++)
            if(a[i]!=0)
                a[n+1]=a[n+1]+a[i];
        printf("%d",a[n+1]);
    }
    return 0;
}
发表于 2019-03-02 12:19:30 回复(0)
#include <cstdio>
#include <iostream>
using namespace std;
int notRelated(int i){
    if(i%7==0)
        return 0;
    else if(i==7||i/10==7||(i-i/10*10)==7)
        return 0;
    return 1;
}
int main(){
    int n;
    cin>>n;
    int sum = 0;
    for(int i = 1;i <= n;i ++){
        if(notRelated(i))
            sum += i*i;
    }
    cout<<sum<<endl;
    return 0;
}

发表于 2019-02-28 22:02:12 回复(0)
#include<stdio.h>
#include<vector>
using namespace std;
bool isRelatedWithSeven(int n){
    while(n>0){
        if(n%7==0||n%10==7){
            return true;
        }
        n/=10;
    }
    return false;
}

int main(){
    vector<int> list;
    for(int i=1;i<100;i++){
        if(!isRelatedWithSeven(i)){
            list.push_back(i);
        }
    }
    int n;
    while(scanf("%d",&n)!=EOF){
        int  result=0;
        for(int i=0;i<=n;i++){
            if(list[i]>n)
                break;
            result+=list[i]*list[i];
        }
        printf("%d\n",result);
    }
    return 0;
}

发表于 2016-10-25 23:23:11 回复(0)

python solution:

while True:
    try:
        res = 0
        for i in range(1, int(input()) + 1):
            if "7" not in str(i) and i % 7 != 0:
                res += i ** 2
        print(res)
    except:
        break
发表于 2017-09-08 11:03:56 回复(0)

一行,多了我不要

try:
    while True:
        print(sum(map(lambda x:x**2,filter(lambda x:x%7!=0 and str(x).find('7')==-1, range(1,int(input())+1)))))
except Exception:
    pass
编辑于 2018-10-04 11:19:40 回复(0)

规定了n<100不要太简单

using namespace std;

bool judge(int n){
    if(n % 7 == 0)
        return false;
    if(n % 10 == 7)
        return false;
    if(n / 10 == 7)
        return false;
    return true;
}

int main(){
    int n;
    while(cin >> n){
        int ret = 0;
        for(int i = 1; i <= n; i++){
            if(judge(i)){
                ret = ret + i * i;
            }
        }
        cout << ret << endl;
    }
    return 0;
}
发表于 2019-03-13 17:12:35 回复(1)
#include<stdio.h>
int main()
{
    int i,n,sum=0;
    scanf("%d",&n);
    for(i=0;i<=n;i++)//0-n
        if(i%7!=0&&i%10!=7&&i/10!=7)
            sum+=i*i;
    printf("%d",sum);
}

发表于 2020-04-01 21:23:34 回复(0)
注意审题:本题最后求得是与7无关的数的平方和
#include <iostream>
(720)#include <cstdio>

using namespace std;

int isRelevant(int n) {
    if (n % 7 == 0) {
        return 0;
    }
    else {
        while (n != 0) {
            if (n % 10 == 7) {
                return 0;
            }
            n /= 10;
        }
        return -1;
    }
}

int main() {
    int n, ret,sum;
    while (scanf("%d", &n) != EOF) {
        sum = 0;
        for (int i = 1; i <= n; i++) {
            ret = isRelevant(i);
            if (ret == -1) {
                sum += i * i;
            }
        }
        printf("%d\n", sum);
    }
    return 0;
}
发表于 2020-02-23 23:58:58 回复(0)
看到  咖喱的cuy 大佬的解答受益匪浅,仿照思路先写判断函数judge再穷举
#include<iostream>
#include<stdio.h>
using namespace std;
bool judge(int x){
    if((x%7!=0)&&(x%10!=7)&&(x/10!=7)){
        return true;
    }
    else{
        return false;
    }
}
int main(){
    int S = 0;
    int n;
    while(cin>>n){
        for(int i=1; i<=n; i++){
            if(judge(i)){
                S += i*i;
            }
        }
        cout<<S<<endl;
    }
    return 0;
}

发表于 2020-02-01 11:45:05 回复(0)
#include<iostream>
#include<cstdio>
using namespace std;

const int maxn = 101;

int num[maxn];      // 记录和

int main()
{
    // 空间换时间
    num[0] = 0;
    num[1] = 1;
    for(int i = 2; i < 100; ++i)
    {
        /**
            1.不能被7整除
            2.个位不为7
            3.十位不为7
        */
        if(i % 7 != 0 && (i%10) != 7 && (i/10) != 7)
        {
            num[i] = num[i-1] + i*i;
        }
        else
        {
            num[i] = num[i-1];
        }
    }

    int n;
    while(cin >> n)
    {
        cout << num[n] << endl;
    }

    return 0;
}


发表于 2016-08-09 14:01:49 回复(0)
由于n <100,故在循环中用 i%10 可以判断是否个位为7,用 i/10 可以判断是否十位为7 
#include<iostream>
using namespace std;

int main(){
    int n;
    while(cin >> n){
        int res = 0;
        for(int i = 1; i <= n; i ++){
            if(i % 7 != 0 && i % 10 != 7 && i / 10 != 7)
                res += i * i;
        }
        cout << res << endl;
    }
    return 0;
}


发表于 2020-04-28 14:57:35 回复(0)
#include <stdio.h>

int Not7(int x){
	if((x/10==7)||(x%10==7)||(x%7==0))
		return 1;
	else 
		return 0;
}
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		int sum=0;
		for(n;n>0;n--){
			if(!Not7(n))
				sum += (n*n);
		}
		printf("%d",sum);
	}
}

发表于 2020-04-24 13:13:12 回复(0)
Java 
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int sum=0;
        for (int i = 1; i <= n; i++)
            if (!(String.valueOf(i).contains("7") || i % 7 == 0)) sum+= i*i;
        System.out.println(sum);
    }
}


发表于 2020-03-18 15:27:25 回复(0)

该代码不只限于<100
#include <bits/stdc++.h>
using namespace std;
int main(){
	int n,j,sum;
	bool flag;
	while(cin>>n){
		sum=0;
		
		for(int i=1;i<=n;i++){
			j=i;
			flag=true;
			if(i%7!=0) {
				while(j!=0){
				j=j%10;
				if(j==7){
					flag=false;
					break;
				}
				j=j/10;
			}
			if(flag) sum+=i*i;
			}
		
		
		}
		
		cout<<sum<<endl;
	}
	return 0;
}



发表于 2020-03-02 19:41:45 回复(0)
#include<stdio.h>
#include<math.h>
int main(){
    int sum=0;
    int n;
    int a[100];
    int size=0;
    while(scanf("%d",&n)!=EOF){
        for(int i=1;i<=n;i++){
            if(i%10!=7&&i/10!=7&&i%7!=0){
                a[size++]=pow(i,2);
                     }   
        }
        for(int j=0;j<size;j++){
            sum+=a[j];
        }
        printf("%d\n",sum);
    }
    return 0;
}

发表于 2019-03-14 17:49:40 回复(0)
思路很清晰,因为限制了范围,所以与7相关的只用考虑十位为7,个位为7和被7整除,在judge函数中进行验证,都不满足则返回0,表示与7无关。
#include<iostream>
using namespace std;
bool judge(int i){
    if(i/10==7)
        return 1;
    if(i%10==7)
        return 1;
    if(i%7==0)
        return 1;
    return 0;
}
int main(){
    int n;
    while(cin>>n){
        int total=0;
        for(int i=1;i<=n;i++){
            if(!judge(i))
                total+=i*i;
        }
        cout<<total<<endl;
    }
}

发表于 2019-02-07 20:16:16 回复(1)
#include <cstdio>

bool relatedto7(int m){
    if(m%7==0) return true; //7的倍数
    if(m/10==7) return true; //十位为7
    if(m%10==7) return true; //个位为7
    return false;       //与7无关
}

int main(){
    int n,sum=0;
    while(scanf("%d",&n) != EOF){
        for(int i=1; i<=n; ++i){
            if(false==relatedto7(i)){
                sum += i*i;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

发表于 2024-01-11 16:21:31 回复(0)
此算法适用于任何n,主要思想是用了一个布尔变量的函数ContainDigitSeven
来判断数是否与7相关,在计算与7无关的整数平方和时,将事件"整数i与7相关"
取对立事件,表示为!(i % 7 == 0 ) && (!ContainDigitSeven(i))
其逻辑值为1时,即表示i是与7无关的整数。

#include<iostream>
using namespace std;

bool ContainDigitSeven(int number) {
	while (number != 0) {
		if (number%10==7) {
			return true;
		}
		number /= 10;
	}
	return false;
}
int main() {
	int n = 0; int sum= 0;
	cin >> n;
	for (int i = 0; i <=n; ++i) {
		if (!(i % 7 == 0 ) && (!ContainDigitSeven(i))) {
			sum += i * i;
		}
	}
	cout << sum << endl;
	return 0;
}


编辑于 2024-01-03 17:09:26 回复(0)