免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2190 | 回复: 3
打印 上一主题 下一主题

[C++] 请学过ACM的朋友对下面的简单程序提出修改建议 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-24 15:37 |显示全部楼层 |倒序浏览
5可用积分
只是简单学习C++,但我是从来没有学过ACM的,因此问的问题可能很可笑,所以还请多多包涵.......
据说著名数学家高斯小时候通过仔细观察发现 1 + 2 + 3 + ... + 99 + 100 的值是 5050. 本题对于给定的正整数 n, 请计算 1 + 2 + 3 + ... + (10^n-1) + 10^n 的值.
Input
有多个测试用例. 每个测试用例是一个不超过 100000 的正整数 n. 输入直至没有数据为止.
Output

在一行上输出 1 到 10n 的累加和.
Sample Input
1
2
Sample Output
55
5050
下面是我的程序,程序可以运行,结果也对。但问题在于测试用例,我设计得不合理。但不知道如何改.......
#include<iostream>
using namespace std;
int main()
{
    int m;
    int sum=1,k;//用整型去定义sum是不对的,考虑过字符型,但对它的使用不熟悉.....

    while(cin>>m)
  {
  
      for(int i=0;i<m;i++)
    {
           
            sum*=10;
    }            
                     
            k=(1+sum)*sum/2;
  }      
  cout<<k<<endl;
   
   return 0;
}
在 n 个相异物品中选出 k 个物品的方法数叫做组合数, 记为 C(n,k). 这个数有一个简洁的公式: n!/(k!(n-k)!). 利用这个公式立即有 C(n,k) = C(n,n-k). 遗憾的是, 这个公式并不方便用于计算. 组合数有许多计算方法, 利用分数可以递推地计算:



C(n,k) = (n/k)*C(n-1,k-1), 其中 0 < k ≤ n, C(n,0) = 1.

也就是

C(n,k) = (n/k)*(n-1/k-1)*...*((n-k+2)/2)*((n-k+1)/1)

本题对于给定的 n, k, 请计算 C(n,k).

Input

有多个测试用例. 每个测试用例是两个整数 n, k ( 0 ≤ k ≤ n < 231), 且 n > 0. 输入直至没有数据为止.

Output

对于每个测试用例, 在一行上输出 C(n,k). 你可以假设这个数小于 264.

Sample Input


1000000000 0
163 5

Sample Output


1
901289592
我编写的程序是
#include<iostream>
using namespace std;
int main()
{
    int n,k;
    int sum=1,m=1;        int comm(int n,int k);
    while(cin>>n>>k)
    {cout<<comm(n,k)<<endl;}
    system("pause");
    return 0;
}
int comm(int n,int k)
{
   
for(int n;n>k;n--)//计算n(n-1)....(n-k+1)
{  sum*=n;}

for(int t=1;t<k+1;t++)//计算k的阶乘
{  m*=t;}

return sum/m;
}

程序的算法不对,因为我得到的答案总是0;还有测试用例也不对,我对测试用例感到很困惑。
望朋友指点!

[ 本帖最后由 中国可爱小牛 于 2009-5-24 16:37 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-05-24 16:11 |显示全部楼层

回复 #2 leadsino 的帖子

谢谢提醒,我改过来了。
另外,不是说很菜就没有接触ACM的权利和自由,我知道我确实不能在这条路走得远,但也很希望能解决一些相当简单的ACM题目啊。如果你不能为我加油的话,那我还是会给自己鼓励,加油。

论坛徽章:
0
3 [报告]
发表于 2009-05-24 16:51 |显示全部楼层
原帖由 daybreakcx 于 2009-5-24 16:40 发表
第一题像你那么做就繁琐了,这是个规律题,根本不用算,规律是5后n-1个0再5再n-1个0,该这么来:
#include
int i,n;
int main()
{
    while (scanf("%d",&n)==1)
    {
        printf("5");
         ...

觉得你好强!测试成功了,谢谢!

论坛徽章:
0
4 [报告]
发表于 2009-05-24 16:54 |显示全部楼层
原帖由 daybreakcx 于 2009-5-24 16:44 发表
第二题按照你那么做必然是超时的!有个方法是把n!,k!和(n-k)!分别质因数分解,然后用质因子次数去减最后再乘起来,常规数论题

从数学上说我知道。但我的不足是不能很好地把它表现在程序中.....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP