hdu2106

来源:互联网 发布:买一个域名要多少钱 编辑:程序博客网 时间:2024/05/01 10:38
 

分析:第一眼看上去,我就觉得此题有点难度,繁琐。其实不然,只是当初没有想到正确可行的计算方法,也一
时被上面说的东西给迷惑了
导致在考试的时候没敢动手去写。当初的第一反应的思路也是错的,老是从数的顺序想该怎么计算,
其实往往可以逆着计算。
遇到这种题目一定不要慌,而是该好好的静下心来,找找规律什么的,不要蛮干……
view plain
#include<iostream> 
//#include<stdio.h> 
#include<string> 
using namespace std; 
int main() 

    int N,i,j,val; 
    long sum; 
    char a[20],ch; 
    while(scanf("%d",&N)!=EOF) 
    { 
        getchar();//接收回车 
        sum=0; 
        while(N--) 
        { 
            i=0;  
            ch=getchar(); 
            while(ch!='(') 
            { 
                a[i]=ch; 
                ++i; 
                ch=getchar(); 
            } 
            scanf("%d",&val); 
            getchar();//接收‘)’ 
            getchar();//接收回车 
            j=1;--i; 
            while(i>=0)//计算核心 
            { 
                sum+=(a[i]-48)*j; 
                j*=val; 
                --i; 
            }    
        } 
        cout<<sum<<endl; 
    } 
    return 0; 

 


#include<iostream>
//#include<cmath>
using namespace std;
inline int pow(int a,int b)//求a的b次方的值
{
    int i;
    int result=1;
    for(i=1;i<=b;i++)
        result*=a;
    return result;   
}
int main()
{
    int c;
    while(cin>>c)
    {
        int a,b,sum=0;
        char d;
        while(c--)
        {
            int k=0;
            cin>>a>>d>>b>>d;
            while(a!=0)
            {
                sum=sum+a%10*pow(b,k++); //逐位相加
                a/=10;  
            }
        }
        cout<<sum<<endl;   
    }
    //system("pause");
    return 0;   
}

这里我想说下为什么要自己写个pow函数,我用的是dev c++,本来想直接用库里面的pow函数,但是提示错误说:call of overloaded `pow(int&, int)' is ambiguous ,意思就是说有歧义的重载,就说说库里面的pow函数不接受两个int型的参数,所以就自己写了一个,ac了。然后在vc 6.0下面又运行了次,vc6.0不会报错,可以接收两个int型的参数,提交后也可以ac。


这个题目本来是比较简单的!
但比赛时一开始没想到 POW函数的返回值没那么大!
所以害的我WA了6次
#include<stdio.h>
#include<string.h>
char str[100];
int main()
{
    int  k,i,j,len;
    int  T,n,mark,mm;
    __int64 cout,mmm;
    while(scanf("%d",&T)!=EOF)
    {
        if(T==0) break;
        cout=0;
        for(j=1;j<=T;j++)
        {
            scanf("%s",str);
            len=strlen(str);
            i=len-2;
            if(str[i]=='0'&&str[i-1]=='1')
            {
                n=10;
                len-=4;
            }
            else
            {
                n=str[i]-'0';
                len-=3;
            }
            i=len-1;
            if(str[0]==0&&str[1]=='(') continue;
            mark=0;
            while(i>=0)
            {
                k=str[i]-'0';
    mmm=1;
               for(mm=1;mm<=mark;mm++)
       mmm*=n;
      cout+=mmm*k;
                mark++;
                i--;
            }
        }
        printf("%I64d\n",cout);
    }
    return 0;
   
}

 

 

题目大意:给你几个数,并指明它是什么进制的,叫你把他们通通转换为10进制后求和,和不超过1亿
 
解题思路:用字符串形式接收数据,分离出数字部分和进制部分,自己写个进制转换函数,参数就是数字和进制啦,进行转换后面求和就是了。可是这题我却WA了2次,最后发现其实就是不能用系统自带的求次方的函数,后来自己写了个就过了。
 
view plainprint?
#include <stdio.h> 
#include <string.h> 
 
long pows(int a,int b) 

    int i; 
    long sum = 1; 
    for (i=0;i<b;i++) 
    { 
        sum=sum*a; 
    } 
    return sum; 

 
int main() 

    int D; 
    char Num[50]; 
    int NumOfTest; 
    char strings[50]; 
    int i,j,k,len,t,g; 
    long sum; 
    /*freopen("e://1.txt","r",stdin);*/ 
    while (scanf("%d",&NumOfTest)!=EOF) 
    { 
        sum = 0; 
        for (i=0;i<NumOfTest;i++) 
        { 
            scanf("%s",strings); 
            j=0; 
            k=0; 
            D = 0; 
            while (strings[j]!='(') 
            { 
                Num[k] = strings[j]; 
                k++; 
                j++; 
            } 
            Num[k] = '/0'; 
            j++; 
            while (strings[j]!=')') 
            { 
                D = D*10+(strings[j]-'0'); 
                j++; 
            } 
            len =strlen(Num); 
            k = len-1; 
            for (j=0;j<len;j++) 
            { 
                g=Num[j]-'0'; 
                t = pows(D,k); 
                sum+=(g*t); 
                k--; 
            } 
        } 
        printf("%ld/n",sum); 
    } 
    return 0; 

很简单的题,了解进制转化,向10进制转换是用位权法,这题,也没超大数..简单..
代码不是很好,提供个思路而已.
c++:
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
main()
{
int n,i,j,t,z,m;
char s[100],*p;
while(cin>>n)
{
    t=0;
    for(i=0;i<n;i++)
    {
        cin>>s;
        p=strstr(s,"(");
        if(*(p+1)=='1')z=10;
        else z=*(p+1)-'0';
        m=p-s;
        for(j=1;j<=m;j++)
        t+=pow(z,j-1)*(*(p-j)-'0');
    }
    cout<<t<<endl;
}
}