列表

详情


HJ99. 自守数

描述

自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 = 625,76^2 = 5776,9376^2 = 87909376。请求出n(包括n)以内的自守数的个数


数据范围:



输入描述

int型整数

输出描述

n以内自守数的数量。

示例1

输入:

6

输出:

4

说明:

有0,1,5,6这四个自守数

示例2

输入:

1

输出:

2

说明:

有0, 1这两个自守数

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 1ms, 内存消耗: 256KB, 提交时间: 2020-07-06

#include<stdio.h>
int main()
{
    unsigned long getNum =0 ;
    while(scanf("%d",&getNum)!=EOF)
    {
        unsigned long sum;
        int no=0;
        int i=0;
        getchar();
        for(i=0;i<=getNum;i++)
        {
            sum=i*i;
            if(sum%10 == i   ||
               sum%100 == i  ||
               sum%1000 == i ||
               sum%10000 == i||
               sum%100000 == i)
            {
                no++;
            }
        }
        printf("%d\n",no);
    }
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 268KB, 提交时间: 2020-12-27

#include <stdio.h>
int repeat_code(int n)
{
	int tmp = n*n;
	for( ; n; ){
		if(n%10 == tmp%10){ n/=10; tmp/=10; continue; }
		return 0;
	}
	return 1;
}
int main(coid)
{
	char flag;
	int i, j, k, num, cnt, arr[88], idx=0, opt[88], id=0;
	for( ; scanf("%d", &num)!=EOF; ){
		if(!num){ opt[id]=0; opt[id+1]=1; id+=2; continue; }
		
		opt[id]=num; id+=2;
		for(i=idx-1; i>=0; i--)
			if(arr[i]<=num) break;
		if(i>=0 && arr[i]==num) continue;
		for(j=idx-1; j>i; j--)
			arr[j+1]=arr[j];
		arr[j+1]=num;
		idx++;
	}
	
	j=cnt=1;
	for(i=flag=0; i<idx; i++){
		num=arr[i];
		if(flag==1){ if( repeat_code(j) ) cnt--; flag=0; }
		else if(flag==2){
			if( repeat_code(j) ) cnt--;
			if( repeat_code(j+4) ) cnt--;
			flag=0;
		}
		for( ; j<=num; j+=10){
			if( repeat_code(j) ) cnt++;
			
			if(j+4<=num){
				if( repeat_code(j+4) ) cnt++;
			}
			else { flag=1; break; }
			
			if(j+5<=num){
				if( repeat_code(j+5) ) cnt++;
			}
			else { flag=2; break; }
		}
		
		for(k=0; k<id; k+=2)
			if(opt[k]==num) opt[k+1]=cnt;
	}
	
	for(k=1; k<id; k+=2)
		printf("%d\n", opt[k]);
	return 0;
}

上一题