zoukankan      html  css  js  c++  java
  • POJ 1001

    #include <stdio.h>
    #include <string.h>
    int a[200], f[200];
    int main()
    {
        char str[7];
        int r[7];
        int n;
        while( scanf("%s %d", str, &n) != EOF )
    	{
    		strrev(str);
    		int k = 0, flag = 0, _k = 0, dotpos;
    		memset(a, 0, sizeof(a));
    		for(int p = 0; str[p]!='\0'; p++)
    			if( str[p] != '.')
    			{    a[k] = r[k] = str[p]-'0';  k++;}
    			else
    			{
    				flag = 1;
    				dotpos = p*n;
    			}
    		_k = k;
    		while(--n)
    		{
    		    int i, j;
    		    memset(f, 0, sizeof(f));
    			for(j = 0; j < k; j++)
    			{
    			    int c = 0;
    				for(i = 0; i < _k; i++)
    				{
    						int t = f[i+j] + a[i] * r[j] + c;
    						f[i+j] = t%10;
    						c = t/10;
    				}
    				f[i+j] += c;
    			}
    			for(int u = 0; u < (i+j); u++)
    				a[u] = f[u];
    			_k = i+j;
    		}
    		if(flag == 0)
    		{
    		    int i, j;
    			for(i = 199; a[i] == 0; i--);
    			for(j = 0; a[j] == 0; j++);
    			for(; i >= j; i--)
    				printf("%d", a[i]);
    		}
    		else if(flag == 1)
    		{
    			int i,j,v;
    			for(i = 198; i >= dotpos; i--)
    			    a[i+1]=a[i];
    			a[dotpos] = -1;
    			for(i = 199; a[i] == 0 || a[i] == -1; i--);
    			for(j = 0; a[j] == 0 || a[j] == -1; j++);
    			if(dotpos > i)
    			{
    			    printf(".");
    				for(v = dotpos-1; v >= j; v--)
    				    printf("%d", a[v]);
    			}
    			if(dotpos < j)
    			{
    				for(v = i; v>dotpos; v--)
    					printf("%d", a[v]);
    			}
    			if(dotpos > j && dotpos < i)
    			{
    				for(v = i; v >= j; v--)
    					if(a[v]==-1)
    					printf(".");
    					else
    					printf("%d", a[v]);
    			}
    		}
    		printf("\n");
    	}
    	return 0;
    }
    

    此题难倒是不难,关键在于情况比较复杂。

    首先,大数乘法不再是两个数而已,而是n次方。因此在循环的过程中一定要注意被乘数的更新。

    其次,最后的输出环节很容易出错。根据题目,有很多要求。写着写着人就糊涂了。。最后我选择了一种比较浪费时间空间却能简化逻辑的算法,还好ac了。

    第三,数组得开大些,要不然装不下结果。

    第四,用数组处理大精度数据时,其存储顺序与数字顺序相反。什么时候减,什么时候加,需要注意!

  • 相关阅读:
    程序员面试金典--最大和子矩阵
    hihocoder-[Offer收割]编程练习赛25
    牛客网--今日头条2017后端工程师实习生笔试题
    牛客网-网易2017内推笔试编程题合集(二)
    hihocoder-1565-大富翁
    引用传递和值传递
    SSH详解
    Oracle中的游标
    Oracle触发器-变异表触发器不能访问本表
    Oracle中 in、exists、not in,not exists的比较
  • 原文地址:https://www.cnblogs.com/ShaneZhang/p/2100443.html
Copyright © 2011-2022 走看看