加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

nyoj-655-光棍的yy(大数)

发布时间:2020-12-14 02:28:28 所属栏目:大数据 来源:网络整理
导读:光棍的yy 时间限制: 1000 ?ms ?|? 内存限制: 65535 ?KB 难度: 2 描述 yy经常遇见一个奇怪的事情,每当他看时间的时候总会看见11:11,这个很纠结啊 。 现在给你m个1,你可以把2个1组合成一个2,这样就不是光棍了 ,问这样的组合有多少种?? 例如(111? 可

光棍的yy

时间限制: 1000?ms ?|? 内存限制: 65535?KB
难度: 2
描述

yy经常遇见一个奇怪的事情,每当他看时间的时候总会看见11:11,这个很纠结啊

现在给你m个1,你可以把2个1组合成一个2,这样就不是光棍了

,问这样的组合有多少种??

例如(111? 可以拆分为 111 12 21? 有三种)

输入
第一行输入一个n表示有n个测试数据
以下n行,每行输入m个1
(1 <= n,m <= 200)
输出
输出这种组合种数,占一行
样例输入
3
11
111
22222
样例输出
2
3
8

解题思路

? ? ? ?通过实验前几组数据可以发现,这个题是斐波那契数列,但是最多有200个1,明显超过int范围,所以需要用到大数。

? ? ? ?大数运算,又称高精度运算,最常用的是利用数组,数组每一位存储大数的每一位,但是要注意是否进位,而且要注意方向。

代码

#include<stdio.h>
#include<string.h>
int num[210][52];
char s[210];
void sum(int n,int m)
{
	int i=50;
	while(i--)
	{
		num[m][i]=num[n][i]+num[n-1][i];
	}
	for(i=0;i<=50;i++)
	    if(num[m][i]>9)//判断是否进位,用x>9或x/10>0 
	    {
	    	num[m][i+1]+=num[m][i]/10;
	    	num[m][i]%=10;
	    }
}
int main()
{
	int n,m;
	int i,j;
	memset(num,sizeof(num));//初始化数组 
	num[1][0]=num[0][0]=1;
	for(i=1;i<=200;i++)
	    sum(i,i+1);
	scanf("%d",&n);
	while(n--)
	{
		scanf("%s",s);
		m=strlen(s);
		for(i=50;i>=0;i--)
		    if(num[m][i]!=0)
		        break;
		for(;i>=0;i--)
		    printf("%d",num[m][i]);
		printf("n");
	}
	return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读