下面是新浪微博上曾经很火的一张图: 。。。。。。。 一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0 对应 arr[0]=8,index[2]=3 对应 arr[3]=0,以此类推…… 很容易得到电话号码是18013820100。
本题要求你编写一个程序,为任何一个电话号码生成这段代码 —— 事实上,只要生成最前面两行就可以了,后面内容是不变的。
输入格式: 输入在一行中给出一个由11位数字组成的手机号码。
输出格式: 为输入的号码生成代码的前两行,其中arr中的数字必须按递减顺序给出。
输入样例:
18013820100
输出样例:
int[] arr = new int[]{8,3,2,1,0}; int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};
分析:我学过java,这题即便它不解释,一看就知道是让干啥的,唯一可能出错的,就是“arr数组中的数字必须按递减顺序给出”,arr数组中的元素满足数学中集合元素的互异性,即各不相同,而11位数字,0-9的10位数字,显然,至少有一个是重复的,使用book数组判断一个数是否已经出现过,便可以解决该问题。注意arr数组中元素必须降序,不能直接sort一把,赋值index数组时,来个暴力双层循环即可,对tel中的每一位都遍历一遍arr数组,从而获得索引。输出注意有花括号和逗号,并且结尾有英文分号;
#include <iostream>
#include <algorithm>
using namespace std
;
bool cmp(int &a
,int &b
){
return a
>b
;
}
int main(){
string tel
;
cin
>> tel
;
int arr
[10];
int k
= 0,p
= 0;
int index
[11];
int book
[10] = {0};
int i
,j
;
for(i
= 0;i
<tel
.length();i
++){
if(book
[tel
[i
]-'0']==0){
book
[tel
[i
]-'0'] = 1;
arr
[k
++] = tel
[i
]-'0';
}
}
sort(arr
,arr
+k
,cmp
);
for(i
= 0;i
<tel
.length();i
++){
for(j
= 0;j
<k
;j
++){
if(tel
[i
]-'0'==arr
[j
]){
index
[p
++] = j
;
}
}
}
cout
<< "int[] arr = new int[]{";
for(i
= 0;i
<k
;i
++){
if(i
!=k
-1){
printf("%d,",arr
[i
]);
}
else
printf("%d};",arr
[i
]);
}
cout
<< endl
;
cout
<< "int[] index = new int[]{";
for(i
= 0;i
<p
;i
++){
if(i
!=p
-1){
printf("%d,",index
[i
]);
}
else
printf("%d};",index
[i
]);
}
return 0;
}