|
2010年8月19日
f(n) 是正整数n 的各位数字之和。如果 f(n) 是1位数那么n的数根就是f(n),否则f(n) 的数根就是n 的数根。举例说明:987的数根是6 (9+8+7=24 2+4=6)。你的任务是找出这样表达式的数根: A1*A2*…*AN + A1*A2*…*AN-1 + … + A1*A2 + A1。
输入包含K个测试样例。输入第一行会给出 K (1<=K<=5)。每个测试样例占一行。这一行的第一个数是一个正整数N (N<=1000)。 接着是N个非负整数 (序列 A)。 均不超过109。
数根(百度知道): http://zhidao.baidu.com/question/29789035.html对于求余数的问题是我一开始就忽略了的地方,后来看了HPF的博客,才知道有这样的技巧: (A+B)mod C = (A mod C) + (B mod C) (AB) mod C = (A mod C) × (B mod C) C编译器 , 0MS 0KB , 如果你把前两句定义变量的语句对调,将会耗费 20MS 的时间
#include <stdio.h> int main() { int i=0,j,K,N,temp,m; long int A; scanf("%d",&K); for (; i<K; i++) { scanf("%d",&N); m=1; A=0; for (j=0; j<N; j++) { scanf("%d",&temp); temp%=9; m=(m*temp)%9; A=(A+m)%9; } printf("%d\n",(A+8)%9+1); } return 0; }
下面的代码没有AC,没有AC的原因是 PE on test 8, 注意,是第八组。我难以理解, 希望大牛们指教!
#include <iostream> #include <stdio.h> using namespace std;
int main() { __int64 x,left,right,mid; scanf("%I64d",&x); left=0; right=x+1; while ((left+1)<right) // 二分查找 { mid=(left+right)/2; if(mid*mid<=x) left=mid; else right=mid; } printf("%I64d",left); return 0; }
2010年8月18日
唉,半年没有切题的后果就是这道水题写了整整3个小时。。。 题目的要求是输入若干组颜色数据,前16组是目标组,后面剩下的都是用来尝试与其映射的,用后面与前面的一次匹配,各循环16次,各自最小的D的相应映射组就是我们要的结果。 C++ 编译器 ,220K 0MS
#include<iostream> #include<climits> // 为第一组数据运算做的约束 using namespace std; int RGB[16][3],in[3],out[3]; // in 用来接收数据, out 用来暂存映射正确的数据
int main(){ for (int i=0; i<16; i++) // 输入的数据中前16组是 target set cin>>RGB[i][0]>>RGB[i][1]>>RGB[i][2]; while (1) { cin>>in[0]>>in[1]>>in[2]; // 开始接收映射组 if (in[0] == -1) break; int MIN=INT_MAX; // 2147483647 for (int i=0; i<16; i++) { int sum=(RGB[i][0]-in[0])*(RGB[i][0]-in[0])+ (RGB[i][1]-in[1])*(RGB[i][1]-in[1])+ (RGB[i][2]-in[2])*(RGB[i][2]-in[2]); // 不需要开方,开方易产生误差 if (sum < MIN) { out[0]=RGB[i][0]; out[1]=RGB[i][1]; out[2]=RGB[i][2]; MIN=sum; // 最小的即映射成功 } } cout<<"("<<in[0]<<","<<in[1]<<","<<in[2]<<") maps to (" <<out[0]<<","<<out[1]<<","<<out[2]<<")"<<endl; } return 0; }
有一点要说明的是<limits.h>头文件,建议MSDN一下,你会发现很多有用的常量,拿来就能用。
2010年8月17日
我觉得有必要把它翻译一下,然后就会发现考得其实是数学,你在google 翻译上是得不到如下翻译的: Description 考虑下面的交流电路。我们将假定电路在稳态。因此,节点1的电压和节点2的电压分别是v1 = VS coswt 和 v2 = VRcos (wt + q),其中Vs是电源电压,w是频率(弧度每秒),t是时间。VR是电阻R两端电压下降的幅度,q是它的相位。
你需要写一个程序,以确定不同的w对应的VR值。您将需要两个电学定律来解决这个问题。第一 个是是欧姆定律,表述为V2 = iR,其中i是在电路顺时针流向的电流大小。 第二个是i = C d/dt (v1-v2),i与电容器两板上的电压有关。"d/dt" 意为求关于t的求导。 Input 输入包括一行或多行。第一行包括三个实数和一个非负整数。实数按顺序是VS,R,C。 整数n是测试用例的个数。接下来的n行就是输入,要求一行一个实数,代表w的值。
Output 输出n行的VR值,注意,结果精确到小数点后三位。 下面需要推导一下求VR的公式: V2=iR=CR d/dt (VS*cos(wt)-VR*cos(wt+q))=VRcos(wt+q) = CR w (sin(wt+q)-sin(wt))=VRcos(wt+q) 下面用到高中数学当中的计算方法,分别令 t=0 和 wt+q=0 ,得到 CRw tan b = 1 和 VR=CRw VS sin b , 然后利用三角函数中的万能公式,求得 :VR = CRw VS / sqrt (1+ (CRw) ^ 2 ))
// C 编译器: #include <stdio.h> #include <math.h> int main() { int i=0,n; double VR,VS,R,C,w; scanf("%lf%lf%lf%d",&VS,&R,&C,&n); for (; i<n; i++) { scanf("%lf",&w); VR=C*R*w*VS / sqrt(1+C*C*R*R*w*w); printf("%.3lf\n",VR); } return 0; }
注意 , 用 double
#include <iostream> #include <string> using namespace std;
int main() { int a[200],b[200],c[400]={0},i,j,ls1,ls2; string s; for (cin>>s,ls1=s.length(),i=ls1-1,j=0; i>=0; i--) a[j++]=s[i]-'0'; //将第一个数逆序放入a数组 for (cin>>s,ls2=s.length(),i=ls2-1,j=0; i>=0; i--) b[j++]=s[i]-'0'; //将第二个数逆序放入b数组
for (i=0; i<ls1; i++) for (j=0; j<ls2; j++) { c[i+j] += a[i]*b[j]; if(c[i+j] >= 10) { c[i+j+1] += c[i+j]/10; c[i+j] %= 10; } } i=399; while (i--) if (c[i]) break; //跳过所有前导0 for (; i>=0; i--) printf("%d",c[i]); //输出主体部分 return 0; }
#include <iostream> #include <string> using namespace std; int main() { int a[201]={0},b[200]={0},i,j,len,ls1,ls2,f=0; // 相加后结果放在a内 string s; for (cin>>s,ls1=s.length(),i=ls1-1,j=0; i>=0; i--) a[j++]=s[i]-'0'; //将第一个数逆序放入a数组 for (cin>>s,ls2=s.length(),i=ls2-1,j=0; i>=0; i--) b[j++]=s[i]-'0'; //将第二个数逆序放入b数组
for (i=0,len=ls1>ls2?ls1:ls2; i<len; i++) // 注意len取二者较大的值 { a[i] += b[i]; //相加结果放入a数组 if (a[i] >= 10) { a[i] %= 10; //进位处理 a[i+1]++; } } if (a[len]) printf("%d",a[len]); //所谓的前导0 for (i=len-1; i>=0; i--) printf("%d",a[i]); //输出主体部分 return 0; }
- 题目描述
- 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
马路上有一些区域要用来建地铁,这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
- 输入
- 输入的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
- 输出
- 输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
- 样例输入
-
500 3
150 300
100 200
470 471
- 样例输出
-
298
基本思路:将所有的树做标记,移走则标记为0,存在标记为1.由于不好判断给定数目是多少,故用向量。效率虽然不高,但是可以AC。
#include <iostream> #include <vector> using namespace std;
int main() { int L,M,i=0,j,start,end,count=0; scanf("%d%d",&L,&M); vector<int> Mark(L+1,1); for (; i<M; i++) { scanf("%d%d",&start,&end); for (j=start; j<=end; j++) Mark[j]=0; } for (i=0; i<=L; i++) if (Mark[i]==1) count++; printf("%d\n",count); return 0; }
Description
输入一个2进制的数,要求输出该2进制数的16进制表示。 在16进制的表示中,A-F表示10-15
Input
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个以0和1组成的字符串,字符串长度至少是1,至多是10000
Output
n行,每行输出对应一个输入。
Sample Input
2
100000
111
Sample Output
20
7
09小孩问我的一道题,原来写的代码足足有90多行,今天重写:
#include <iostream> #include <string> using namespace std;
int main() { int n,pos,sec,i,j,w[4] = {1,2,4,8}; //sec是分段处理,pos是对应权值位置 char x[17] = "0123456789ABCDEF"; //打表 string bin; //输入的二进制字符串 cin>>n; while (n--) { cin>>bin; sec=bin.length()%4; pos=0; for (i=sec; i>0; i--) if (bin[sec-i]=='1') pos += w[i-1]; if (sec) printf("%c",x[pos]); for (i=sec; i<bin.length(); i+=4) { pos=0; for (j=0; j<4; j++) if (bin[i+j]=='1') pos += w[3-j]; printf("%c",x[pos]); } printf("\n"); } return 0; }
Description
你的一个朋友买了一台电脑。他以前只用过计算器,因为电脑的显示器上显示的数字的样子和计算器是不一样,所以当他使用电脑的时候会比较郁闷。为了帮助他,你决定写一个程序把在电脑上的数字显示得像计算器上一样。
Input
输入包括若干行,每行表示一个要显示的数。每行有两个整数s和n (1 <= s <= 10, 0 <= n <= 99999999),这里n是要显示的数,s是要显示的数的尺寸。
如果某行输入包括两个0,表示输入结束。这行不需要处理。
Output
显示的方式是:用s个'-'表示一个水平线段,用s个'|'表示一个垂直线段。这种情况下,每一个数字需要占用s+2列和2s+3行。另外,在两个数字之间要输出一个空白的列。在输出完每一个数之后,输出一个空白的行。注意:输出中空白的地方都要用空格来填充。
Sample Input
2 12345
3 67890
0 0
Sample Output
-- -- --
| | | | | |
| | | | | |
-- -- -- --
| | | | |
| | | | |
-- -- --
--- --- --- --- ---
| | | | | | | |
| | | | | | | |
| | | | | | | |
--- --- ---
| | | | | | | |
| | | | | | | |
| | | | | | | |
--- --- --- ---
Hint
数字(digit)指的是0,或者1,或者2……或者9。 数(number)由一个或者多个数字组成。
这题横跨我一个学期之久,后来无奈还是百度了一下:
#include <iostream> using namespace std;
char n1[] = "- -- -----"; char n2[] = "| ||| ||"; char n3[] = "||||| |||"; char n4[] = " ----- --"; char n5[] = "| | | | "; char n6[] = "|| |||||||"; char n7[] = "- -- -- --";
int main() { int m; char n[10]; cin>>m>>n; while ((n[0]-'0')||m) { int len = strlen(n); for (int i=0;i<len;i++) { cout<<" "; int num = n[i]-'0'; for (int j=0;j<m;j++) { cout<<n1[num]; } cout<<" "; } cout<<endl; int temp = m; while (temp--) { for (int i=0;i<len;i++) { int num = n[i]-'0'; cout<<n2[num]; for (int j=0;j<m;j++) { cout<<" "; } cout<<n3[num]; cout<<" "; } cout<<endl; } for (int i=0;i<len;i++) { cout<<" "; int num = n[i]-'0'; for (int j=0;j<m;j++) { cout<<n4[num]; } cout<<" "; } cout<<endl; temp = m; while (temp--) { for (int i=0;i<len;i++) { int num = n[i]-'0'; cout<<n5[num]; for (int j=0;j<m;j++) { cout<<" "; } cout<<n6[num]; cout<<" "; } cout<<endl; } for (int i=0;i<len;i++) { cout<<" "; int num = n[i]-'0'; for (int j=0;j<m;j++) { cout<<n7[num]; } cout<<" "; } cout<<endl<<endl;
cin>>m>>n; } return 0; }
我想,第一次做出来这题的人真是了不起!
|