|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
#include <math.h>
#define hei 100 //判断y or n的代码不可执行
int main(){
int num;
int world;
int l;//一个数的立方
int sum=0;//这个立方的奇数和
int m;
int arr[hei]={0};
printf("请输入一个整数:");
scanf("%d",&num);
printf("经验证,3~%d之间所有的整数均符合尼科彻斯定理!\n",num);
printf("是否打印所有句子(y/n):");
scanf("%c",&world);
if(world=='y'){
for(int k=3;k<=num;k++){
for(int i=1;i<=l;i+=2){//小于这个数的所有奇数
int k=0;
for(int j=i;j<=l;j+=2){
sum+=j;
arr[k]=j;
k++;
if(sum>l){
sum=0;
k=0;
break;
}
if(sum==l){
printf("%d=",l);
for(m=0;m<k-1;m++){
printf("%d+",arr[m]);
}
printf("%d\n",arr[m]);
}
}
}
}
}
return 0;
}
本帖最后由 sfqxx 于 2023-4-16 16:34 编辑
这段代码有以下三个问题:
1. 宏定义的变量`hei` 设定为100,但数组长度以作为数组大小的变量`l`的值未经初始化即使用,因此 `l` 的值不确定。在后面的代码中, `l` 又被用来控制循环次数,这可以导致越界访问造成程序崩溃。
2. 在输入`world` 的值时,`scanf()`函数读取了一个字符,但是该字符并不是用户想要输入的 `y` 或 `n`, 而是按下回车键留下的换行符(`\n`), 因为之前的 `scanf()`函数读取完输入后回车符会留在缓冲区。解决方法如下:
scanf(" %c",&world);
在 `%c` 前加一个空格,则 `scanf()` 函数会自动跳过之前留在缓冲区的任何空白符,包括回车符。
3. 在 if 语句中,`for` 循环中的变量 `k` 覆盖了外部的 `k` 变量,导致第一个循环变量失效。解决方法是调整循环变量的名称。
所以,修改这些错误,可以得到以下代码:
- #include <stdio.h>
- #include <math.h>
- #define hei 100
- int main() {
- int num;
- int l;
- int sum;
- int m;
- int arr[hei] = {0};
- printf("请输入一个整数:");
- scanf("%d", &num);
- getchar(); // 用于读取scanf留下的换行符
- printf("经验证,3~%d之间所有的整数均符合尼科彻斯定理!\n", num);
- printf("是否打印所有句子(y/n):");
- char world = getchar();
- if (world == 'y') {
- for (int k = 3; k <= num; k++) {
- l = k * k * k;
- sum = 0;
- for (int i = 1; i <= l; i += 2) {
- int k = 0;
- for (int j = i; j <= l; j += 2) {
- sum += j;
- arr[k] = j;
- k++;
- if (sum > l) {
- sum = 0;
- k = 0;
- break;
- }
- if (sum == l) {
- printf("%d=", l);
- for (m = 0; m < k - 1; m++) {
- printf("%d+", arr[m]);
- }
- printf("%d\n", arr[m]);
- }
- }
- }
- }
- }
- return 0;
- }
复制代码 有用请设置最佳答案
|
|