用一张一元票换 1 分、2 分和 5 分的硬币?程序输出有问题,求高手指教

微光世界· 2013-01-28 10:59:52
用一张一元票换 1 分、2 分和 5 分的硬币,输出换法。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int one, two, five;
int count = 0;

for (five = 1; five <= 19; five++)
for (two = 1; two <= 47; two++) {
one = 100 - 5 * five - 2 * two;
if (one > 0) {
count++;
printf("第 %d 种换法:five = %d, two = %d, one = %d \n", count, five, two, one);
}
}
printf("一共有 %d 种换法", count);
return 0;
}


主要是程序输出有问题,少了很多种情况。网上搜了下,发现很多答案输出也有这个问题,请问这是为什么啊?怎么修改呢?
...全文
451 14 点赞 打赏 收藏 举报
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
didijiji 2013-01-29
引用 楼主 kresnik168 的回复:
用一张一元票换 1 分、2 分和 5 分的硬币,输出换法。 C/C++ code?12345678910111213141516171819#include <stdio.h>#include <stdlib.h> int main(void){ int one, two, five; int count = 0; for (five = 1; fi……
你的循环有错误,如果用1元(100分)换1分,2分,5分的硬币的话 应该是: 1分循环是 0—100 2分循环是 0—50 5分循环是 0—20
  • 打赏
  • 举报
回复
didijiji 2013-01-29
我之前写的两个小程序: 其一: 100块钱找零的问题:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
  
int main()
{
    int i, j, k, m, n, r;
    int a, b, c, d, e, f;
    int count = 0;
  
    for(r = 0; r <= 2; r++)
    {
        for(n = 0; n <= 5; n++)
        {
            for(m = 0; m <= 10; m++)
            {
                for(k = 0; k <= 20; k++)
                {
                    for(j = 0; j <= 50; j++)
                    {
                        for(i = 0; i <= 100; i++)
                        {
                            int total = i * 1 + j * 2 + k * 5 + m * 10 + n * 20 + r * 50;
 
                            if(20 == total)
                            {
                                //printf("50:%d   20:%d   10:%d   5:%d   2:%d  1:%d\n", r, n, m, k, j, i);
 
                                for(a = 0; a < r; a++)
                                {
                                    printf("50 ");
                                }
 
                                for(b = 0; b < n; b++)
                                {
                                    printf("20 ");
                                }
 
                                for(c = 0; c < m; c++)
                                {
                                    printf("10 ");
                                }
 
                                for(d = 0; d < k; d++)
                                {
                                    printf("5 ");
                                }
 
                                for(e = 0; e < j; e++)
                                {
                                    printf("2 ");
                                }
 
                                for(f = 0; f < i; f++)
                                {
                                    printf("1 ");
                                }
 
                                printf("\n");
                                count++;
                            }
                        }
                    }
                }
            }
        }
    }
  
    printf("\n\ncount = %d\n", count);
    system("pause");
    return 0;
}
运行结果: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 5 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 2 1 1 1 1 1 1 1 1 1 1 1 1 1 5 2 2 1 1 1 1 1 1 1 1 1 1 1 5 2 2 2 1 1 1 1 1 1 1 1 1 5 2 2 2 2 1 1 1 1 1 1 1 5 2 2 2 2 2 1 1 1 1 1 5 2 2 2 2 2 2 1 1 1 5 2 2 2 2 2 2 2 1 5 5 1 1 1 1 1 1 1 1 1 1 5 5 2 1 1 1 1 1 1 1 1 5 5 2 2 1 1 1 1 1 1 5 5 2 2 2 1 1 1 1 5 5 2 2 2 2 1 1 5 5 2 2 2 2 2 5 5 5 1 1 1 1 1 5 5 5 2 1 1 1 5 5 5 2 2 1 5 5 5 5 10 1 1 1 1 1 1 1 1 1 1 10 2 1 1 1 1 1 1 1 1 10 2 2 1 1 1 1 1 1 10 2 2 2 1 1 1 1 10 2 2 2 2 1 1 10 2 2 2 2 2 10 5 1 1 1 1 1 10 5 2 1 1 1 10 5 2 2 1 10 5 5 10 10 20 其二: 零钱限制为(1,2,5,10,20,50 元),100 元人民币有多少种换零方式?

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
int main()
{
    int i, j, k, m, n, r;
    int count = 0;
 
    for(r = 0; r <= 2; r++)
    {
        for(n = 0; n <= 5; n++)
        {
            for(m = 0; m <= 10; m++)
            {
                for(k = 0; k <= 20; k++)
                {
                    for(j = 0; j <= 50; j++)
                    {
                        for(i = 0; i <= 100; i++)
                        {
                            if(100 == i * 1 + j * 2 + k * 5 + m * 10 + n * 20 + r * 50)
                            {
                                count++;
                            }
                        }
                    }
                }
            }
        }
    }
 
    printf("count = %dn", count);
    system("pause");
    return 0;
}
结果: count = 4562
  • 打赏
  • 举报
回复
Shawshenk_We 2013-01-28
的确是行数限制的问题 我在Linux中的输出就没有被挤掉的现象 话说为什么一定要修改行数限制呢 可以修改一下你的输出方式啊 每行输出的情况多一点 尽量压缩在100行以内
  • 打赏
  • 举报
回复
无魂冬冬 2013-01-28
就把printf("第 %d 种换法:five = %d, two = %d, one = %d \n", count, five, two, one);中的 \n 该为 \t 或者把 \n 去掉 就是不那么好看~~
  • 打赏
  • 举报
回复
微光世界· 2013-01-28
哦,我找到方法了,加一句
system("mode con:cols=100 lines=500");
即可
  • 打赏
  • 举报
回复
微光世界· 2013-01-28
引用 6 楼 kkkkkxiaofei 的回复:
估计确实是有行数限制,我用VC调试可以从200多行开始显示,你再加个在输出前再加个count<200的话前200行的也会显示,可见程序是没有问题的,应该是行数太多。另外个人认为完全可以考虑某种硬币没有的情况,即0<=one<=100,0<=two<=50,0<=five<=20,只要乘积的总和为100就行了么。
题目说要每种至少一个。话说一定要用文件吗?有没有办法修改行数限制?
  • 打赏
  • 举报
回复
微光世界· 2013-01-28
引用 5 楼 amoyman 的回复:
控制台输出,行数超过一定值时,前面的行会被挤掉,只保留最近的N行。 你看到的这种情况,就是属于“行数太多被挤掉”的情况。 试着把输出转到方件,就可以看到所有的记录本了。 另:你的算法是“1分2分5分硬币都至少有一个” 以下是我做的代码,完成后会生成一个 yuan.txt 的文本文件,你看看这个文件应该就明白了。 C/C++ code?12345678910111……
我运行了一下你的程序,有8个错误啊。我不懂C++,不知道怎么修改,请问有没有C语言的改法?
  • 打赏
  • 举报
回复
估计确实是有行数限制,我用VC调试可以从200多行开始显示,你再加个在输出前再加个count<200的话前200行的也会显示,可见程序是没有问题的,应该是行数太多。另外个人认为完全可以考虑某种硬币没有的情况,即0<=one<=100,0<=two<=50,0<=five<=20,只要乘积的总和为100就行了么。
  • 打赏
  • 举报
回复
阿麦 2013-01-28
控制台输出,行数超过一定值时,前面的行会被挤掉,只保留最近的N行。 你看到的这种情况,就是属于“行数太多被挤掉”的情况。 试着把输出转到方件,就可以看到所有的记录本了。 另:你的算法是“1分2分5分硬币都至少有一个” 以下是我做的代码,完成后会生成一个 yuan.txt 的文本文件,你看看这个文件应该就明白了。

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
	ofstream ofs("yuan.txt", ios::out);
	int one, two, five;
	int leave = 0;
	int maxtwo;
	int count = 0;
	char buffer[100];
	for (five = 1; five <= 19; five++)
	{
		leave = 100 - five * 5;
		maxtwo = (leave - 1) / 2;
		for (two = 1; two <= maxtwo; two++)
		{
			one = leave - two - two;
			count++;
			sprintf_s(buffer, 100, "%5d:  5-%d, 2-%d, 1-%d\n", count, five, two, one);
			printf_s("%s", buffer);
			ofs.write(buffer, (streamsize)strlen(buffer));
			
			if (five < 1 || two < 1 || one < 1)
			{
				system("pause");
			}
		}
	}
	sprintf_s(buffer, 100, "Count=%d\n", count);
	printf_s("%s", buffer);
	ofs.write(buffer, (streamsize)strlen(buffer));
	ofs.close();
	system("pause");
	return 0;
}
  • 打赏
  • 举报
回复
derekrose 2013-01-28
把输出的打印到文件中试试
  • 打赏
  • 举报
回复
微光世界· 2013-01-28
引用 2 楼 didijiji 的回复:
这个输出问题是哪个输出问题?
我这边显示461种换法,然后就显示366到461之间的结果,前面都没有了!5分都是从11个开始的,比如10个5分、20个2分、10个1分这样的情况都没输出。
  • 打赏
  • 举报
回复
didijiji 2013-01-28
这个输出问题是哪个输出问题?
  • 打赏
  • 举报
回复
微光世界· 2013-01-28
对了,我的环境是win7下CodeBlocks
  • 打赏
  • 举报
回复
引用 9 楼 kresnik168 的回复:
哦,我找到方法了,加一句 C/C++ code ? 1 system("mode con:cols=100 lines=500");即可[/quot [quote=引用 9 楼 kresnik168 的回复:] 哦,我找到方法了,加一句 C/C++ code ? 1 system("mode con:cols=100 lines=500");即可
恩,一看这代码就是控制输出行数的
  • 打赏
  • 举报
回复
相关推荐
发帖
C语言
加入

6.5w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2013-01-28 10:59
社区公告
暂无公告