为啥我的结果一直循环输出1
#include <stdio.h>//问题:水仙花数是指一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身。例如:153 = 13 + 53+ 33。本题要求编写程序,计算所有N位水仙花数。输入在一行中给出一个正整数N(3<=N<=7)。#include <math.h>
int main() {
int N, i, j, k, sum = 0, y;
printf("输入一个正整数(3<=N<=7):");
scanf("%d", &N);
for (i = pow(10, N - 1); i < pow(10, N); i++) {
int x = i;
for (j = 0; j < N; j++) {
y = i % 10;
i = i / 10;
sum = sum + pow(y, N);
}
if (x == sum) {
printf("%d\n", sum);
} else {
sum = 0;
}
}
return 0;
} i = i / 10;这是在循环中更改循环自增变量
会出问题的 wp231957 发表于 2022-9-12 05:44
i = i / 10;这是在循环中更改循环自增变量
会出问题的
是的,楼主可以加个变量。 #include <stdio.h>
int main(void)
{
unsigned long long d , e , i , j , k , n , p , s ;
printf("输入一个正整数(3 <= N <= 7) : ") ;
scanf("%I64u" , & n) ;
for(i = 3 , d = 100 ; i <= n ; i ++ , d *= 10) {
for(k = d ; k < d * 10 ; k ++) {
for(s = 0 , e = k ; e ; e /= 10) {
for(j = 0 , p = 1 ; j < i ; j ++) p = p * (e % 10) ;
s += p ;
}
if(s == k) printf("%I64u\n" , k) ;
}
}
}
编译、运行实况:
D:\\C>g++ -o x x.c
D:\\C>x
输入一个正整数(3 <= N <= 7) : 7
153
370
371
407
1634
8208
9474
54748
92727
93084
548834
1741725
4210818
9800817
9926315
D:\\C> for语句的循环控制变量在循环语句中最好不去改变呀 本帖最后由 jhq999 于 2022-9-12 21:46 编辑
int unsignedintpow(int x,int y)
{
int s=x;
while(--y)s*=x;
return s;
}
int main() {
int N, i, j, k, sum = 0, y;
printf("输入一个正整数(3<=N<=7):");
scanf("%d", &N);
for (i = unsignedintpow(10, N - 1); i < unsignedintpow(10, N); i++) {
int x = i;
for (j = 0; j < N; j++) {
y = x % 10;
x = x / 10;
sum = sum + unsignedintpow(y, N);
}
if (i == sum) {
printf("%d\n", sum);
}
sum = 0;
}
return 0;
}
scanf("%d", &N);
min= unsignedintpow(10, N - 1),max=unsignedintpow(10, N);
int numNpow;
for(i=0;i<10;i+=1){
numNpow=unsignedintpow(i, N);
}
for (i=min; i <max ; i++) {
int x = i;
for (j = 0; j < N&&sum<max; j++) {
y = x % 10;
x = x / 10;
sum = sum + numNpow;
}
if (i == sum)
printf("%d\n", sum);
sum = 0;
}
unsigned long long min,max;
unsigned long long unsignedintpow(unsigned long long x,unsigned long long y)
{
unsigned long long s=x;
while(--y)s*=x;
return s;
}
unsigned long long pownumadd(unsigned long long *numpow,unsigned long long sum,unsigned long long num,unsigned long long n)
{
if(0==n)
{
if(sum==num&&sum>=min)printf("%llu\n",sum);
return 1;
}
else
{
for(unsigned long long i=num?0:1; i<10; i+=1)
{
if(sum+numpow<max)
{
pownumadd(numpow,sum+numpow,num*10+i,n-1);
}
else
break;
}
}
return 0;
}
int main() {
unsigned long long N,i;
printf("输入一个正整数(3<=N<=7):");
scanf("%llu", &N);
min= unsignedintpow(10, N - 1),max=unsignedintpow(10, N);
unsigned long long numNpow;
for(i=0;i<10;i+=1){
numNpow=unsignedintpow(i, N);
}
pownumadd(numNpow,0,0,N);
return 0;
} #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int isNarcissisticNumber(int num, int N) {
int sum = 0, temp = num;
while (temp) {
sum += (int)pow(temp % 10, N);
temp /= 10;
}
return sum == num;
}
int main(void) {
int N;
printf("输入一个正整数(3 <= N <= 7): ");
if(scanf("%d", &N)) 0;
for (int n = (int)pow(10, N - 1); n < (int)pow(10, N); ++n) {
if (isNarcissisticNumber(n, N)) {
printf("%d\n", n);
}
}
return 0;
} jackz007 发表于 2022-9-12 09:59
编译、运行实况:
计算出7位数的数,答案应该是只有最后4位数 wp231957 发表于 2022-9-12 05:44
i = i / 10;这是在循环中更改循环自增变量
会出问题的
明白了,这里在第二个循环里面的i用x代替就解决了;不更换导致出第二个循环到第一个循环时,变量发生了变更 桃花飞舞 发表于 2022-9-12 06:08
是的,楼主可以加个变量。
在第二个循环里面把i换成x就好了,已解决 本帖最后由 jackz007 于 2022-9-13 00:10 编辑
阿亮不减肥 发表于 2022-9-12 23:54
计算出7位数的数,答案应该是只有最后4位数
看不懂,啥意思,难道是 n = 7 的时候找出来的水仙花数不对? jackz007 发表于 2022-9-13 00:08
看不懂,啥意思,难道是 n = 7 的时候找出来的水仙花数不对?
意思是N等于7只计算10^6到10^7之间的水仙花数,你那个是计算100到10的N次方之间的水仙花数
页:
[1]