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