1067
输入16组三维坐标(二维数组,for循环至16);
输入其他R G B(直到三个值为-1 -1 -1结束,break跳出循环),利用假循环while(1)输出(里面嵌套for循环判断最短距离的点)结果。
1115
输入一个整数,各个位数相加,直至最后为个位数。
这是我第一次在ZOJ中使用 函数 以及 递归 的思想。但是还有很多地方不明白,如(int)(void)()三者区别,有时候就是无法编译;string.h(strlen为长度)与string(length为长度)的区别。以后继续努力。
问题:
int main(void)
{
int a;
while(cin>>a&&a!=0){
cout<<digitroot( a)<<endl;
}
}
数字可能很大,这样的主函数无法AC,应该用字符串来输入(借鉴了别人的代码,然后AC)。
int main(void){
string s;while(cin>>s&&s[0]!='0'){
int a = 0;
for(int i=0; i<s.length(); i++){
a = a + s[i] -'0'; //char转换为int
}
cout<<digitroot(a)<<endl; //digitroot函数
}
}
by the way,今天的题看起来都很简单,最后都是借鉴了别人的经验才通过的。以后不要所有东西都定义为int,有时候数组、字符串是不错的选择。
1067
#include<iostream>
#include<stdio.h>
using namespace std;
int a[16][3];
int main(){
int i;
int R,G,B;
int m,n,k;
for(i=0;i<16;i++){
cin>>a[i][0];
cin>>a[i][1];
cin>>a[i][2];
}
while(1){
int m=-1,n=-1; //利用-1判断,0不可以(不知道为什么)
cin>>R>>G>>B;
if(R==-1&&G==-1&&B==-1) break;
for(i=0;i<16;i++){
m=(R-a[i][0])*(R-a[i][0])+(G-a[i][1])*(G-a[i][1])+(B-a[i][2])*(B-a[i][2]);
if(n==-1||m<n){
n=m;
k=i;
}
}
printf("(%d,%d,%d) maps to (%d,%d,%d)",R,G,B,a[k][0],a[k][1],a[k][2]);
printf("
");
}
}
1115
#include<iostream>
#include<string>
using namespace std;
int digitroot( int a)
{
int dr = 0;
while( a > 0)
{
dr += a%10; //dr累计所有位数求和
a /= 10;
}
if( dr > 9)
return digitroot( dr); //递归思想,若不为个位数,继续函数
return dr;
}
int main(void){
string s;
while(cin>>s&&s[0]!='0'){
int a = 0;
for(int i=0; i<s.length(); i++){
a = a + s[i] -'0'; //char转换为int
}
cout<<digitroot(a)<<endl; //digitroot函数
}
}