zoukankan      html  css  js  c++  java
  • nyoj-655-光棍的yy(大数)

    光棍的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
    11111
    例子输出
    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,0,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("
    ");
    	}
    	return 0;
    }
    


  • 相关阅读:
    内部类
    三大修饰符:static、final、abstract
    面向对象三大特性
    类和方法
    Vue-创建工程+element UI
    xshell连接虚拟机较慢问题 -----已解决
    Hbase配置
    Hive的安装配置
    Hive内容+配置
    Redis全局命令
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6708898.html
Copyright © 2011-2022 走看看