#include"stdio.h"
main()
{
int i,j,n;
scanf("%d",&n);
for(j=1;j<=n;j*=10)
for(i=j;i<j*10;i++)
if(i==i*i%(j*10))
printf("%d",i);
}
我想达成的目的是,输入一个10的正整数次幂n,输出1到n所有的同构数
我的认知里,判断同构数的方法是:如果这是个十位数,就看其平方值除于100的余数是否等于这个数,以此类推
所以,我以位数为判断标准,将1至n的所有数分成了
一位数:[1,9)
两位数:[10,99)
三位数:[100,999)
直到[n/10,n-1)
这样的多组数据,其表达式为:[j,(j*10)-1)【j是10的整数次幂,如1,10,100】
由于n是10的正整数次幂,所以n不可能是同构数,不需要对n进行判断
我在编写程序的时候,用了两个for
for(j=1;j<=n;j*=10)
for(i=j;i<j*10;i++)
if(i==i*i%(j*10))
printf("%d",i);
/*第二个for的用处是:判断并输出j到(j*10)-1当中所有的同构数。当i=j*10时,这一组x位数也随之检测完毕,循环结束
转回for(j=1;j<=n;j*=10)
这个时候j自乘10,就进入了下一组数据,重新开始执行第二个for*/
按照我的这段程序来看,我输入一个1000,就会变成:
for(j=1;j<=1000;j*=10)
for(i=j;i<j*10;i++)
if(i==i*i%(j*10))
printf("%d",i);
首先j=1,满足j<=1000,开始执行
for(i=j;i<j*10;i++)
if(i==i*i%(j*10))
printf("%d",i);
当i=10时,这个for语句结束
for(j=1;j<=1000;j*=10)的一次执行结束
此时j自乘10,j=10,满足j<=1000,开始执行第二次对【j,(j10)-1)当中每个数的判断
因为j会在判断完这一组数之后自乘10,所以重新执行第二个for语句的时候一方面会自动进入下一组数,一方面“if(i==ii%(j*10))”的判定也不会受影响
理论上是没有问题的
但是当我实际运行的时候,电脑只给我输出了一个空白
这里主要想问一下,我是哪里出错了。是逻辑错了还是编写的程序出错了,错在哪里
#include"stdio.h"
main()
{
int i,j,n;
scanf("%d",&n);
for(j=1;j<=n;j*=10)
for(i=j;i<j*10;i++)
if(i==i*i%(j*10))
printf("%d",i);
}
#include <stdio.h>
int main()
{
long i, j, k, n;
scanf("%ld", &n);
k = 10;
for (i = 1; i <= n; i++)
{
if (i == k)
k *= 10;
j = i * i;
if (j % k == i)
printf("%ld\t%ld\n", i, j);
}
return 0;
}