S1E21课后作业第1题
本帖最后由 须弥芥子 于 2022-9-10 00:00 编辑为什么单独512出问题?{:10_243:} {:10_243:} {:10_243:} /*************************************************************************
> File Name: 1plus.c
> Author: Yanjl
> Mail: miku.cy@foxmail.com
> Created Time: 2022/9/9 22:51:57
************************************************************************/
#include<stdio.h>
#define MAX 1024
int main(){
int num, sum, count;
int numList;
//当数字个数>3时用冒号省略
_Bool shengLue;
int lifNum;
_Bool fuHe = 1;
//j用于写入输出数字
int j = 0;
//k是数字位次
int k = 0;
count = 3;
sum = 0;
printf("请输入一个整数:");
scanf("%d",&num);
for(int z = 3; z <= num; z++){
lifNum = z * z * z;
for(int i = 1; ; i += 2){
sum += i;
if(j <= 2){
numList = i;
shengLue = 0;
j++;
}else{
numList = i;
shengLue = 1;
}
if(sum == lifNum){
k++;
break;
}
if(sum > lifNum){
j = 0;
i = (count += 2);
sum = 0;
shengLue = 0;
}if(count > lifNum){
fuHe = 0;
break;
}
}
}
if(fuHe){
printf("经验证,3 - %d 之间所有的整数均符合尼科彻斯定理!\n",num);
printf("\n是否打印所有式子(1/0):");
int userChoice;
scanf("%d",&userChoice);
if(userChoice == 1){
for(int p = 0; p < k; p++){
if(shengLue){
printf("%d = %d + %d ... + %d\n", lifNum, numList, numList, numList);
}else{
printf("%d = %d + %d + %d\n", lifNum, numList, numList, numList);
}
}
}
}
return 0;
}
本帖最后由 桃花飞舞 于 2022-9-10 10:18 编辑
jackz007 发表于 2022-9-10 09:54
尼克彻思很简单啊,有那么复杂吗?
他这个代码写的太差,变量用的太多,思路不显而易见,第二用他这种方法来做这个定理验证也不是简单的题, 如果在判断一个数之后 if(sum == lifNum){
k++;
break;
}把sum清零 if(sum == lifNum){
k++;
sum = 0;
break;
},可以避免512的时的问题,但是判断别的数字时候又出现了lifNum, numList, numList, numList变量更新不到正确值得情况,我猜测别的数字也会出现512的现象,只是看不到 没时间帮你调试啊
可是,你可以把这个程序copy一份,然后单独对512进行处理,也不要考虑只输出3个数的问题
这样程序会简化不少 wp231957 发表于 2022-9-10 07:53
没时间帮你调试啊
可是,你可以把这个程序copy一份,然后单独对512进行处理,也不要考虑只输出3个数的问题 ...
赞同1楼说法,其实我也不太了解为什么,因为根本没时间调试查找,我也有事情忙 本帖最后由 jackz007 于 2022-9-10 09:56 编辑
尼克彻思很简单啊,有那么复杂吗?
#include <stdio.h>
int nico(int n)
{
int h , k ;
h = n * n - n ;
if(! (h % 2)) h ++ ;
printf("%d = %d" , n * n * n , h) ;
for(k = 1 ; k < n ; k ++) printf(" + %d" , h + 2 * k) ;
printf("\n") ;
return h ;
}
int main(void)
{
int count , j ;
char judge ;
printf("请输入一个整数:") ;
scanf("%d" , & count) ;
printf("经验证 ,3 ~ %d 之间所有的整数均符合尼科彻斯定理!\n\n" , count) ;
printf("是否打印所有的式子(y/n) :") ;
fflush(stdin) ;
judge = getchar() ;
if(judge == 'Y' || judge == 'y') for(j = 3 ; j <= count ; j ++) nico(j);
} jackz007 发表于 2022-9-10 09:54
尼克彻思很简单啊,有那么复杂吗?
我的编程思想还需培养{:10_266:} 桃花飞舞 发表于 2022-9-10 10:08
他这个代码写的太差,变量用的太多,思路不显而易见,第二用他这种方法来做这个定理验证也不是简单的题 ...
确实,64又出问题了{:10_257:} 须弥芥子 发表于 2022-9-10 10:55
确实,64又出问题了
这题本来有答案的,你可以按着原题答案的思路来做。如果按照你这个思路,我调试不出来,你再想想别的方法来做,而且这题相当复杂,难度也算进阶了。你一开始数组没有初始化,用了一个for的死循环,而且一维数组,二维数组一起用,也增加了阅读的复杂性。如果不知道结束条件一般建议用while循环。 须弥芥子 发表于 2022-9-10 10:55
确实,64又出问题了
你那种答案的64也是可以这样分解的 练习练习:{:10_254:}#include <stdio.h>
typedef struct {
int num, n; // num: 整数的平方数, n: 为式子数量
int start, end; // 式子从 start 开始,并以 +2 方式递增, end 结束
}Nicomachus;
Nicomachus nicomachus(int num) {
Nicomachus res;
res.num = num;
res.start = 1;
int sum = res.n = 0;
for (int i = res.start; i <= num; i += 2) {
sum += i;
res.n++;
if (sum > num) {
while (sum > num) {
sum -= res.start;
res.start += 2;
res.n--;
}
}
if (sum == num) {
res.end = i;
break;
}
}
return res;
}
int main(void) {
int num = 512;
Nicomachus res = nicomachus(num);
printf("%d = %d + ... + %d (共%d个式子)", res.num, res.start, res.end, res.n);
return 0;
}512 = 17 + ... + 47 (共16个式子) 傻眼貓咪 发表于 2022-9-10 14:16
练习练习:
赞{:10_257:}
页:
[1]