1字符串循环右移(5分)
题目内容:
输入一个字符串和一个非负整数N,要求将字符串循环右移N次。
输入格式:
输入在第1行中给出一个字符串,以'#'表示结束,‘#’不是字符串的一部分,字符串的长度未知,但至少有一个字符;输入的第2行给出非负整数N。
输出格式:
在一行中输出循环右移N次后的字符串。
输入样例:
Hello World!#
2
输出样例:
d!Hello Worl
时间限制:500ms内存限制:32000kb
#include
#include
int main(){
char str[101],ch;
int n ,i,j;
gets(str);
scanf("%d",&n);
int len=strlen(str);
str[len -1] ='\0';
len -=2;
for( i=1;i<=n;i++){
ch =str[len];
for(j=len-1;j>=0;--j)
str[j+1] = str[j];
str[0]=ch;
}
printf("%s",str);
return 0;
}
2.最小包围矩形(5分)
题目内容:
给定一组二维坐标,表示直角坐标系内的一个多边形的连续的顶点的坐标序列。计算能包围这个多边形的平行于坐标轴的最小矩形,输出它的左下角和右上角的坐标。
输入格式:
第一行是一个正整数n表示顶点的数量,第二行是n组整数,依次表示每个顶点坐标的x和y值。
输出格式:
四个整数,依次表示所计算的矩形的左下角的坐标的x、y值和右上角坐标的x、y值。
输入样例:
5
1 1 1 4 3 7 4 4 4 1
输出样例:
1 1 4 7
时间限制:500ms内存限制:32000kb
//用我喜爱的大数组做法
#include
int main(){
int n,i;
int arr[101];
scanf("%d",&n);
for(i=0;i
scanf("%d",&arr[i]);
}
int x1,y1,x2,y2;
x1=x2=arr[0];
y1=y2=arr[1];
for(i=2;i
if(x1>arr[i]) x1=arr[i];
if(x2
if(y1>arr[i+1]) y1=arr[i+1];
if(y2
i++;
}
printf("%d %d %d %d",x1,y1,x2,y2);
return 0;
}
//网上找个别人的做法,发现也差不多
#include
#define ARRAY_SIZE 100
struct Point {
int x;
int y;
};
struct Point p[ARRAY_SIZE];
int main(void) {
int i, n;
int min_x, max_x, min_y, max_y;
scanf("%d", &n);
for(i = 0; i < n; ++i)
scanf("%d%d", &p[i].x, &p[i].y);
min_x = max_x = p[0].x;
min_y = max_y = p[0].y;
for(i = 1; i < n; ++i) {
if(min_x > p[i].x)
min_x = p[i].x;
if(max_x < p[i].x)
max_x = p[i].x;
if(min_y > p[i].y)
min_y = p[i].y;
if(max_y < p[i].y)
max_y = p[i].y;
}
printf("%d %d %d %d\n", min_x, min_y, max_x, max_y);
return 0;
}
3大数计算(20分)
题目内容:
很大的数就没办法用int或是long long这样的类型直接计算了,用double则无法保证精度什么的,所以,得自己写程序来算。你的程序要读入两个很大的数,范围在
内,然后你的程序要计算它们的和、差及积并输出。
输入格式:
两行,每行一个数字。
输出格式:
三行,每行一个数字,依次表示输入的数字的和、差及积。
输入样例:
1853244628050278
506996688545785164
输出样例:
508849933173835442
-505143443917734886
939588889486756266731803978475592
时间限制:1000ms内存限制:64000kb
//听说是ACM里面的题,不会做,只能抄叶卡君的代码
#include
#include
void calsum(int *a,int *b,int *ans){
int i;
for(i=0;i<60;i++){
ans[i] += a[i] + b[i];
if(ans[i]>=10){
ans[i]%=10;
ans[i+1]++;
}
}
}
void calmins(int *a,int *b,int *ans){
int i;
for(i=0;i<60;i++){
ans[i] += a[i]-b[i];
while(ans[i]<0){
ans[i+1]--;
ans[i] += 10;
}
}
}
void printans(int *ans,int len){
int flag=0,i;
for(i=len-1;i>=0;i--){
if(ans[i]!=0) flag=1;
if(flag) printf("%d",ans[i]);
}
if(!flag) printf("0");
}
int main(){
char a[60],b[60];
gets(a);
gets(b);
int n1[60]={0},n2[60]={0};
int n1sign=1,n2sign=1; // sing =1 ->表正 0->表负
int n1len=strlen(a), n2len=strlen(b);
if(a[0]=='-') n1sign = 0;
if(b[0]=='-') n2sign = 0;
int i,j;
for(i=n1len-1,j=0; i>=0&&a[i]!='-'; i--,j++) n1[j]=a[i]-'0';
for(i=n2len-1,j=0; i>=0&&b[i]!='-'; i--,j++) n2[j]=b[i]-'0';
int abig=1;
// 负数的时候,数减去前面的负号
if(!n1sign) n1len--;
if(!n2sign) n2len--;
if(n2len>n1len) abig=0;
else if(n1len == n2len){
for(i=n1len;i>=0;i--){
if(n1[i]>n2[i]) break;
else if(n1[i]==n2[i]) continue;
else{
abig=0;break;
}
}
}
// 加法运算
int sum[60]={0};
if(n1sign&&n2sign){
calsum(n1,n2,sum);
printans(sum,60);
}else if(!n1sign&&!n2sign){ // ab 都是负数,绝对值相加,再加负号
printf("-");
calsum(n1,n2,sum);
printans(sum,60);
}else if(n1sign&&abig){
calmins(n1,n2,sum);
printans(sum,60);
}else if(n1sign&&!abig){
calmins(n2,n1,sum);
if(sum[0]!=0) printf("-");
printans(sum,60);
}else if(n2sign&&abig){
calmins(n1,n2,sum);
if(sum[0]!=0) printf("-");
printans(sum,60);
}else{
calmins(n2,n1,sum);
printans(sum,60);
}
printf("\n");
// 减法运算
int mins[60]={0};
if(n1sign&&!n2sign){
calsum(n1,n2,mins);
printans(mins,60);
}else if(!n1sign && n2sign){
printf("-");
calsum(n1,n2,mins);
printans(mins,60);
}else if(n1sign && !abig){
calmins(n2,n1,mins);
if(mins[0]!=0) printf("-");
printans(mins,60);
}else if(!n1sign && abig){
calmins(n1,n2,mins);
if(mins[0]!=0) printf("-");
printans(mins,60);
}else{
calmins(n2,n1,mins);
printans(mins,60);
}
printf("\n");
//乘法运算
int multiply[121]={0};
for(i=0;i<60;i++){
for(j=0;j<60;j++){
multiply[i+j] += n1[i]*n2[j];
while(multiply[i+j] >= 10){
multiply[i+j+1] += multiply[i+j]/10;
multiply[i+j] %= 10;
}
}
}
if((n1sign&&!n2sign)||(!n1sign&&n2sign)) printf("-");
printans(multiply,121);
return 0;
}
4分数比较(10分)
题目内容:
本题要求编写程序,比较两个分数的大小。
输入格式:
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是int类型范围内的正整数。
输出格式:
在一行中按照“a1/b1关系符a2/b2”的格式输出两个有理数的关系。其中“>”表示“大于”,“
注意在关系符前后各有一个空格。
输入样例:
1/2 3/4
输出样例:
1/2 < 3/4
时间限制:500ms内存限制:32000kb
//此题坑啊,第四个测试点总是没过,不是为啥 ( ▼-▼ )
#include
int main(){
long int a1,b1,a2,b2;
scanf("%ld/%ld %ld/%ld",&a1,&b1,&a2,&b2);
//做通分处理
if(b1==1&&b2==1){
printf("1/1 = 1/1");
}else{
int m = a1*b2+b1*b2;
int n = a2*b1+b2*b1;
if(m < n) printf("%ld/%ld < %ld/%ld",a1,b1,a2,b2);
else if(m > n) printf("%ld/%ld > %ld/%ld",a1,b1,a2,b2);
else if(m = n)printf("%ld/%ld = %ld/l%d",a1,b1,a2,b2);
}
return 0;
}