1.相亲数
输入两个正整数a和b,若a的所有约数(包括1,不包括a本身)的和等于b,且b的所有约数(包括1,不包括b本身)的和等于a,则两个数是相亲数。要求分别输出两个正整数的约数和的式子,再换行后输出1或0,表示这两个数是否为“相亲数”。
o编写一个程序计算 x 和 y 分别除了本身以外的因子之和,并判断 x 和 y 是不是一对相亲数。x 和 y 为大于 1 的 int 范围内的整数。
【样例输入】
220 284
【样例输出】
220,110+55+44+22+20+11+10+5+4+2+1=284
284,142+71+4+2+1=220
1
输入: x 和 y,空格隔开。
输出:
第一行输出 x,一个逗号,x 的除了本身以外的因子之和的计算过程(见题意,要求降序输出每个因子),不要有多余的空格。
第二行输出 y,一个逗号,y 的除了本身以外的因子之和的计算过程(见题意,要求降序输出每个因子),不要有多余的空格。
第三行,如果 x 和 y 是一对相亲数输出 1,否则输出 0。文末换行可有可无。
#include<stdio.h>
void deal(int a,int &sum){
printf("%d,",a);
for(int i=a-1;i>=1;i--){
if(a%i==0){
sum+=i;
if(i!=1)printf("%d+",i);//注意格式调整
else printf("%d=",i);
}
}
printf("%d\n",sum);
}
int main(){
int a,b;
while(scanf("%d%d",&a,&b)!=EOF){//EOF是文档的结尾
int sum=0,sum1=0;
deal(a,sum);
deal(b,sum1);
if(sum==b&&sum1==a)printf("1\n");//&&两个同时都要满足
else printf("0\n");
}
return 0;
}
2.窗口模拟点击
题目:窗口点击模拟
描述:在计算机屏幕上,有N个窗口。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。当你用鼠标点击某个点的时候,若其在窗口内,你就选择了处于被点击位置所属的最顶层窗口,并且这个窗口就会被移到所有窗口的顶层,而剩余的窗口的层次顺序不变,如果你点击的位置不属于任何窗口计算机就会忽略你这次点击。编写一个程序模拟点击窗口的过程:先从标准输入读入窗口的个数,窗口编号和位置(以窗口的左上角和右下角的坐标表示,先输入的窗口层次高),然后读入点击的次数和位置(以点击的坐标表示),编写程序求得经过上述点击后的窗口叠放次序。
假设:
屏幕左下角作为X轴和Y轴坐标原点,即坐标为(0,0),所有输入的坐标数值都是整数,并且都大于等于0,小于等于1000。
输出窗口的叠放次序时从最后点击后最顶层的窗口编号开始按层次依次输出;
输入的窗口个数大于0并且小于等于10,点击次数大于0并且小于等于20。
输入:第一行窗口个数n,接下来n行每行一个窗口的编号、左下角坐标、右上角坐标。 接下来一行点击次数k,接下来k行每行一个点击坐标。
输出:一行n个数字,表示K次点击后按层次排列的窗口编号,空格隔开。 行末空格与文末换行可有可无。
样例:
输入:
4
1 43 31 70 56
2 50 24 80 50
3 23 13 63 42
4 57 36 90 52
5
47 28
73 40
68 32
82 43
27 49
输出:
4 2 3 1
//注意题目中先输入的层次高是指先收入的在底层
#include<stdio.h>
int main(){//或者用结构体、
int n,m,i,j,x,y;
int a[10][10];//存每个窗口的编号和坐标
int b[10];//依次放窗口叠放次序从顶层到底层的窗口在a中的下标
while(scanf("%d",&n)!=EOF){
for(i=n-1;i>=0;i--){//输入窗口,a[0]的层次最低(在最顶层)
scanf("%d%d%d%d%d",&a[i][0],&a[i][1],&a[i][2],&a[i][3],&a[i][4]);
b[i]=i;//存放窗口编号
}
scanf("%d",&m);
for(i=0;i<m;i++){//m个输入
scanf("%d%d",&x,&y);
for(j=0;j<n;j++){//在输入的窗口之内,j表示在上面的窗口个数
if(x>=a[b[j]][1]&&x<=a[b[j]][3]&&y>=a[b[j]][2]&&y<=a[b[j]][4]){//交换
int temp=b[j];
for(int k=j;k>=1;k--){
b[k]=b[k-1];
}
b[0]=temp;
break;
}
}
}
for(i=0;i<n;i++){
printf("%d ",a[b[i]][0]);
if(i==n-1)printf("\n");
}
}
return 0;
}
3.文章识别
描述:输入一篇可能未经排版的文章,挑选出其中的单词【单词中不包含“(”等特殊符号】,然后按字典序输出。
输入:从文件中读取文章
输出:按字典序输出单词
样例:
输入:
When most kids go to school and study the knowledge, few special kids have made their history. A small boy from America wins the international contest by defeating adult competitors. He becomes the youngest winner. He has the gift and so many parents want to have such a kid. Though we are not that smart, we still can study hard to realize our dreams.
输出:
见代码后面的截图
#include<stdio.h>
#include<string.h>
#include<cctype>
#include<algorithm>
using namespace std;
struct wordtype{
char word[30];
int count;
}w[100];
int wordcount=0;//记录数组实际存放的单词数(去重)
bool cmp(wordtype a,wordtype b){//结构体的排序
if (strcmp(a.word,b.word)<0)return true;
else return false;
}
int find(char temp[]){//查找以前是否有过这个单词
for(int i=0;i<wordcount;i++){
if(strcmp(w[i].word,temp)==0){
return i;
}
}
return -1;
}
int main(){
char c;
char temp[30];
int a=0;
while(scanf("%c",&c)!=EOF){
if(isalpha(c)) temp[a++]=c;
else{
temp[a]=0;
if(a==0) continue;//多余的空格,不处理并读入下一个
else{//上一个单词结束了
a=0;//不要忘记清0
int i=find(temp);
if (i!=-1){//以前有过此单词
w[i].count++;
}
else{//建立一个结构体并把它放在结构体数组中
wordtype tmp;
strcpy(tmp.word,temp);
tmp.count=1;
w[wordcount]=tmp;
wordcount++;
}
}
}
}
sort(w,w+wordcount,cmp);//结构体数组排序,需要实现cmp函数
for(int i=0;i<wordcount;i++){//输出
printf("%s %d\n",w[i].word,w[i].count);
}
return 0;
}