C语言课后作业21动动手第二题求助
本帖最后由 软大头 于 2021-10-5 16:51 编辑#include<stdio.h>
#include<math.h>
int main()
{
bool flag=0;
int i,j,k,l,n,cubed,sum,count;
int str;
j=3;
i=2;
printf("请输入一个整数:");
scanf("%d",&n);
cubed=n*n*n;
int result;
for(i=2;;i++)
{
for(j=3;;j=j+2)
{
sum=j*i+i*(i-1); //设分解后的第一个奇数是j,一共有i个
if(sum>cubed)
{
break;
}
else if(sum==cubed) //得到j和i
{
flag=1;
break;
}
}
if(flag)
{
break;
}
}
for(k=0;k<i;k++)
{
str=j+2*k;
}
printf("%d=",cubed);
for(l=0;l<i;l++)
{
printf("%d,",str);
}
printf("\b");
return 0;
}
这是我的动动手1的答案,但是同样的方法却在动动手2出问题了??
#include<stdio.h>
#include<math.h>
int main()
{
bool flag=0;
int i,j,k,l,n,cubed,sum,num,m,count;
int str={0};
char c;
count=0;
printf("请输入一个整数:");
scanf("%d",&num);
for(l=3;l<=num;l++)
{
cubed=pow(l,3);
for(i=2;;i++)
{
for(j=3;;j=j+2)
{
sum=j*i+i*(i-1); //设分解后的第一个奇数是j,一共有i个
if(sum>cubed)
{
break;
}
else if(sum==cubed) //得到j和i,同时将成功次数加1
{
count=count+1;
flag=1;
break;
}
}
if(flag)
{
break;
}
}
for(k=0;k<i;k++)
{
str=j+2*k; //把分解的奇数存放
}
}
if(count==num-2) //如果成功分解次数等于3-num的个数,说明定理成立。
{
printf("成立!\n");
}
else
{
printf("不成立!\n");
}
printf("是否需要打印?y/n:");
getchar();
scanf("%c",&c);
if(c=='y')
{
for(m=3;m<=num;m++)
{
cubed=pow(m,3);
printf("%d=",cubed);
for(n=0;n<100;n++)
{
if(str==0)
{
break;
}
else
{
printf("%d+",str);
}
}
printf("\b");
printf("\n");
}
}
return 0;
}
这是我的动动手2的答案,每次试到5的时候就开始犯病了。这是为啥啊??大佬们救救我吧。 还有每次打印式子我发现\b并没有起作用,我用的是Dev-c++
没有看明白你的问题
还有,题目是什么?
人造人 发表于 2021-10-5 15:06
没有看明白你的问题
还有,题目是什么?
验证尼科彻斯定理:任何一个大于 2 的整数的立方都可以表示成一串连续奇数的和,这些奇数一定是要连续的(比如 3^3 == 7 + 9 + 11)。用户输入某个整数,验证该数是否符合尼科彻斯定理,并将对应的式子打印出来。改进(动动手2):用户输入一个表示范围的最大值 count,程序将测试 3 ~ count 所有的整数是否都符合尼科彻斯定理。 就是我用1的方法是没问题的,结果同样的式子用到动动手2发现就出问题了。 软大头 发表于 2021-10-5 15:10
就是我用1的方法是没问题的,结果同样的式子用到动动手2发现就出问题了。
看不懂你这个式子,这是在做什么?
sum = j * i + i * (i - 1); 本帖最后由 软大头 于 2021-10-5 15:49 编辑
人造人 发表于 2021-10-5 15:37
看不懂你这个式子,这是在做什么?
n*n*n=n*(n*n),
令a=n*n,所以n*(n*n)=>n*a=>a+a+a+...+a(n个a相加);
if(n%2){(a-n/2*2)+....+a-2+a+(a+2)+(a+4)+...+(a+n/2*2)}
else
{(a-n/2*2+1)+...+(a-1)+(a+1)+(a+3)+....+(a+n/2*2-1)} 原来是尼克彻斯
#include <stdio.h>
int nico(int n)
{
int h , k ;
h = n * n - n ;
if(! (h % 2)) h ++ ;
printf("%d" , h) ;
for(k = 1 ; k < n ; k ++) printf(" + %d" , h + 2 * k) ;
printf("\n") ;
return h ;
}
int main(void)
{
char s ;
int d , m ;
for(;;) {
printf("An integer please : ") ;
fgets(s , 64 , stdin) ;
if(m) {
sscanf(s , "%d" , & d) ;
nico(d) ;
printf("\n") ;
} else {
break ;
}
}
} jackz007 发表于 2021-10-5 16:13
原来是尼克彻斯
额我没学多少所以不知道int main前面的式子啥意思,我想问下我的第二个式子哪里出错了,第一个式子我试过没问题了 软大头 发表于 2021-10-5 15:48
没有看懂你的那个公式,你用错公式了吧?
sum = j * i + i * (i - 1);
这个公式就是计算 i 到 j 之间的所有奇数的和吧?
i,i + 2,i + 4,i + 6,。。。,j
#include <stdio.h>
#include <stdbool.h>
int main(void) {
size_t n;
printf("请输入一个数:");
scanf("%lu", &n);
size_t cubed = n * n * n;
size_t i, j;
for(i = 1; ; i += 2) {
for(j = i; ; j += 2) {
size_t num = (j - i) / 2 + 1;
size_t sum = (i + j) * num / 2;
if(sum > cubed) break;
if(sum == cubed) goto done;
}
}
done:
printf("%lu => ", cubed);
for(; i <= j; i += 2) {
printf("%lu ", i);
}
printf("\n");
return 0;
}
$ gcc-debug -o main main.c
$ ./main
请输入一个数:3
27 => 7 9 11
$ ./main
请输入一个数:4
64 => 1 3 5 7 9 11 13 15
$ ./main
请输入一个数:5
125 => 21 23 25 27 29
$
#include <stdio.h>
#include <stdbool.h>
int main(void) {
size_t n;
printf("请输入一个数:");
scanf("%lu", &n);
size_t cubed = n * n * n;
size_t i, j;
for(i = 1; ; i += 2) {
for(j = i; ; j += 2) {
//size_t num = (j - i) / 2 + 1;
//size_t sum = (i + j) * num / 2;
size_t sum = j * i + i * (i - 1);
if(sum > cubed) break;
if(sum == cubed) goto done;
}
}
done:
printf("%lu => ", cubed);
for(; i <= j; i += 2) {
printf("%lu ", i);
}
printf("\n");
return 0;
}
$ gcc-debug -o main main.c
$ ./main
请输入一个数:3
27 => 1 3 5 7 9 11 13 15 17 19 21 23 25 27
$
#include <stdio.h>
#include <stdbool.h>
void output(size_t n) {
size_t cubed = n * n * n;
size_t i, j;
for(i = 1; ; i += 2) {
for(j = i; ; j += 2) {
size_t num = (j - i) / 2 + 1;
size_t sum = (i + j) * num / 2;
if(sum > cubed) break;
if(sum == cubed) goto done;
}
}
done:
printf("%lu => ", cubed);
for(; i <= j; i += 2) {
printf("%lu ", i);
}
printf("\n");
}
int main(void) {
size_t a, b;
printf("请输入两个数:");
scanf("%lu%lu", &a, &b);
for(size_t i = a; i <= b; ++i) output(i);
return 0;
}
$ gcc-debug -o main main.c
$ ./main
请输入两个数:3 9
27 => 7 9 11
64 => 1 3 5 7 9 11 13 15
125 => 21 23 25 27 29
216 => 7 9 11 13 15 17 19 21 23 25 27 29
343 => 43 45 47 49 51 53 55
512 => 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47
729 => 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53
$
人造人 发表于 2021-10-5 16:54
没有看懂你的那个公式,你用错公式了吧?
我是将n*n*n分解为一共i项 软大头 发表于 2021-10-5 17:02
我是将n*n*n分解为一共i项
主要是我第一个答案没问题。同样的方法再用到下一道题从输入的数为4开始时,i就一直等于2了,也不知道问题出在哪了 软大头 发表于 2021-10-5 17:02
我是将n*n*n分解为一共i项
这里为什么要算 n * n * n
这里不应该是算
i + (i + 2) + (i + 4) + (i + 6) + ...
算这个的和是不是 cubed 吗?
为什么要算n * n * n
人造人 发表于 2021-10-5 17:06
这里为什么要算 n * n * n
这里不应该是算
i + (i + 2) + (i + 4) + (i + 6) + ...
是cubed,然后我把起始的奇数设为j,一共i项 软大头 发表于 2021-10-5 17:08
是cubed,然后我把起始的奇数设为j,一共i项
我再研究研究 人造人 发表于 2021-10-5 17:10
我再研究研究
麻烦您了 看懂你的那个公式了,公式没问题
错误在于 flag 没有复位
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
int main() {
bool flag = 0;
int i, j, k, l, n, cubed, sum, num, m, count;
int str = {0};
char c;
count = 0;
printf("请输入一个整数:");
scanf("%d", &num);
for(l = 3; l <= num; l++) {
cubed = pow(l, 3);
// 这里
flag = 0;
for(i = 2;; i++) {
for(j = 3;; j = j + 2) {
sum = j * i + i * (i - 1); //设分解后的第一个奇数是j,一共有i个
if(sum > cubed) {
break;
} else if(sum == cubed) //得到j和i,同时将成功次数加1
{
count = count + 1;
flag = 1;
break;
}
}
if(flag) {
break;
}
}
for(k = 0; k < i; k++) {
str = j + 2 * k; //把分解的奇数存放
}
}
if(count == num - 2) //如果成功分解次数等于3-num的个数,说明定理成立。
{
printf("成立!\n");
} else {
printf("不成立!\n");
}
printf("是否需要打印?y/n:");
getchar();
scanf("%c", &c);
if(c == 'y') {
for(m = 3; m <= num; m++) {
cubed = pow(m, 3);
printf("%d=", cubed);
for(n = 0; n < 100; n++) {
if(str == 0) {
break;
} else {
printf("%d+", str);
}
}
//printf("\b");
printf("\n");
}
}
return 0;
}
人造人 发表于 2021-10-5 17:37
看懂你的那个公式了,公式没问题
错误在于 flag 没有复位
哦哦哦哦哦哦,谢谢大佬,辛苦你了
页:
[1]