做了下有道难题的练习赛,有兴趣的看看。

windsting 2010-05-29 06:37:23
分数平摊给前面20个回帖的(不重复给)同学吧,

//A:与7无关的数查看
//描述
//一个正整数,如果它能被7整除,或者它的十进制表示法中某个位数上的数字为7,则称其为与7相关的数.现求所有小于等于n(n<100)的与7无关的正整数的平方和.
//输入
//输入为一行,正整数n,(n<100)
//输出
//输出小于等于n的与7无关的正整数的平方和
//样例输入
//21样例输出
//2336


#include <iostream>
using namespace std;

bool Like7(int i)
{
if(!(i%7))
return true;
if(7==i%10)
return true;
if(7==i/10)
return true;

return false;
}

int main( int argc,char** argv )
{
int iIn;
int iResult=0;
cin >> iIn;
while(iIn)
{
if(!Like7(iIn))
iResult += iIn * iIn;
--iIn;
}

cout << iResult;
}

//B:unix纪元查看
//
//描述
//在著名的unix系统中,使用了一种简洁高效的时间表示方法,即:
//将1970年1月1日0点作为“unix纪元”的原点,从1970年1月1日开始经过的秒数存储为一个32位整数
//
//请编写一个程序,帮助把一个unix时间辍,转换成形如"YYYY-mm-dd HH:ii:ss"的格式,其中的字母分别代表
//YYYY 4 位数字完整表示的年份
//mm 数字表示的月份,有前导零的 2 位数字
//dd 月份中的第几天,有前导零的2位数字
//HH 小时,24 小时格式,有前导零
//ii 有前导零的分钟数
//ss 秒数,有前导零
//
//输入
//输入数据有若干行,每行包含一个整数t,(0<=t<2^31)
//输出
//对每一行输入数据,输出一行,为形如“YYYY-mm-dd HH:ii:ss”格式的时间
//样例输入
//10
//1234567890
//样例输出
//1970-01-01 00:00:10
//2009-02-13 23:31:30


#include <iostream>
#include <sstream>
using namespace std;

enum Misc
{
sPerMin = 60,
sPerHour= sPerMin * 60,
sPerDay = sPerHour * 24,
};

int iDaysOfMonth[][13] =
{
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};

int iDaysOfYear[] = {365,366};

int bLeap[] = {0,0,1,0};

bool LeapYear(int i)
{
if(0==i%100)
{
if(0==i%400)
return true;
}
else
{
if(0==i%4)
return true;
}
return false;
}

inline bool DaysLargeTheYear(int iDays,int iYear)
{
return iDays >= iDaysOfYear[LeapYear(iYear)];
}

inline bool DayslargeTheMonth(int iDays,int iMonth,int iLeap)
{
return iDays >= iDaysOfMonth[iLeap][iMonth];
}

int main()
{
int iTime;
cin >> iTime;
int iDays = iTime / sPerDay;
int iHours= iTime / sPerHour % 24;
int iMins = iTime / sPerMin % 60;
int iSeconds = iTime % 60;

int iYear=1970;
while(DaysLargeTheYear(iDays,iYear))
{
iDays -= iDaysOfYear[LeapYear(iYear)];
++iYear;
}

int iLeap = LeapYear(iYear);
int iMonth = 1;
while(DayslargeTheMonth(iDays,iMonth,iLeap))
{
iDays -= iDaysOfMonth[LeapYear(iYear)][iMonth];
++iMonth;
}

++iDays;

ostringstream buf;
buf.fill('0');

buf << iYear << "-" ;
buf.width(2);
buf << iMonth << "-";
buf.width(2);
buf<< iDays << " ";
buf.width(2);
buf << iHours << ":";
buf.width(2);
buf << iMins << ":";
buf.width(2);
buf << iSeconds ;

cout << buf.str();
}

//C:和数查看
//描述
//给定一个整数序列,判断其中有多少个数,等于数列中其他两个数的和。
//比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。
//输入
//第一行是一个整数T,表示一共有多少组数据。 1<= T <= 100
//接下来的每组数据共两行,第一行是数列中数的个数n ( 1 <= n <= 100),第二行是由n个整数组成的数列。
//
//输出
//对于每组数据,输出一个整数(占一行),就是数列中等于其他两个数之和的数的个数。
//样例输入
//2
//4
//1 2 3 4
//5
//3 5 7 9 10
//样例输出
//2
//1


#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;

size_t InnerSum(vector<int>& vec)
{
sort(vec.begin(),vec.end());
size_t iResult=0;
for(size_t i=2;i<vec.size();++i)
{
for(size_t j=0;j<i;++j)
{
bool bFound=false;
for(size_t k=j+1;k<i;++k)
{
if(vec[i]==vec[j]+vec[k])
{
++iResult;
bFound = true;
break;
}

}
if(bFound)
break;
}
}

return iResult;
}

int main()
{
int iGroups;
cin >> iGroups;
vector<int> vResult;
while(iGroups--)
{
int iNums;
cin >> iNums;
vector<int> vInt;
while(iNums--)
{
int i;
cin >> i;
vInt.push_back(i);
}
vResult.push_back(InnerSum(vInt));
}

for(size_t i=0;i<vResult.size();++i)
{
cout << vResult[i] << endl;
}
}
...全文
283 32 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
musiccoder 2010-05-30
  • 打赏
  • 举报
回复
恩,学习了,虽然没分。
windsting 2010-05-30
  • 打赏
  • 举报
回复
晕倒,unix纪元的解答太马虎了,修改之后的:
#include <iostream>
#include <sstream>
using namespace std;

enum Misc
{
sPerMin = 60,
sPerHour= sPerMin * 60,
sPerDay = sPerHour * 24,
};

int iDaysOfMonth[][13] =
{
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};

int iDaysOfYear[] = {365,366};

int bLeap[] = {0,0,1,0};

bool LeapYear(int i)
{
if(0==i%100)
{
if(0==i%400)
return true;
}
else
{
if(0==i%4)
return true;
}
return false;
}

inline bool DaysLargeTheYear(int iDays,int iYear)
{
return iDays >= iDaysOfYear[LeapYear(iYear)];
}

inline bool DayslargeTheMonth(int iDays,int iMonth,int iLeap)
{
return iDays >= iDaysOfMonth[iLeap][iMonth];
}

int main()
{
int iTime;
while(cin >> iTime)
{
int iDays = iTime / sPerDay;
int iHours= iTime / sPerHour % 24;
int iMins = iTime / sPerMin % 60;
int iSeconds = iTime % 60;

int iYear=1970;
while(DaysLargeTheYear(iDays,iYear))
{
iDays -= iDaysOfYear[LeapYear(iYear)];
++iYear;
}

int iLeap = LeapYear(iYear);
int iMonth = 1;
while(DayslargeTheMonth(iDays,iMonth,iLeap))
{
iDays -= iDaysOfMonth[LeapYear(iYear)][iMonth];
++iMonth;
}

++iDays;

ostringstream buf;
buf.fill('0');

buf << iYear << "-" ;
buf.width(2);
buf << iMonth << "-";
buf.width(2);
buf<< iDays << " ";
buf.width(2);
buf << iHours << ":";
buf.width(2);
buf << iMins << ":";
buf.width(2);
buf << iSeconds ;

cout << buf.str() << endl;
}
}
windsting 2010-05-29
  • 打赏
  • 举报
回复
准备结贴,按顺序以下同学每人20分,有冤假错案的跟帖指出,不过貌似没机会改过了。

xie6723632
mstlq
LightBoat09
leehowe
yanran_hill
plumstar
xinshou2595
luodonglong
wing_0706
zmlovelx
cblcz
cattycat
thefirstz
ljm503097719
ming0753
acdnjjjdjkdckjj
patricxuqi
sai1312
gigglesun
liliming1234
zhaowenzhi1234 2010-05-29
  • 打赏
  • 举报
回复
分数不重要,学习啦~~
tjyjx7946358 2010-05-29
  • 打赏
  • 举报
回复
拿分来了。。。
llllllllllllleon 2010-05-29
  • 打赏
  • 举报
回复
看看喃。。。。。
ithiker 2010-05-29
  • 打赏
  • 举报
回复
接分,还有不~
cblcz 2010-05-29
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 patricxuqi 的回复:]
哈哈楼主自己的回帖不能算啊
[/Quote]

前20楼除楼主、重复,其他人平均拿分
patricxuqi 2010-05-29
  • 打赏
  • 举报
回复
哈哈楼主自己的回帖不能算啊
sai1312 2010-05-29
  • 打赏
  • 举报
回复
对于第三道题,楼主考虑的还不够全面,如果输入四个零:0,0,0,0.会什么样?应该输出12.
我对代码做了一些修改,如下:

//C:和数查看
//描述
//给定一个整数序列,判断其中有多少个数,等于数列中其他两个数的和。
//比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。
//输入
//第一行是一个整数T,表示一共有多少组数据。 1<= T <= 100
//接下来的每组数据共两行,第一行是数列中数的个数n ( 1 <= n <= 100),第二行是由n个整数组成的数列。
//
//输出
//对于每组数据,输出一个整数(占一行),就是数列中等于其他两个数之和的数的个数。
//样例输入
//2
//4
//1 2 3 4
//5
//3 5 7 9 10
//样例输出
//2
//1


#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;

size_t InnerSum(vector<int>& vec)
{
sort(vec.begin(),vec.end());
size_t iResult=0;
for(size_t i=0;i<vec.size();++i)
{
for(size_t j=0;j<vec.size();++j)
{
if(j==i)
continue;
//bool bFound=false;
for(size_t k=j+1;k<vec.size();++k) // 因为 vec[j]+vec[k] 与 vec[k]+vec[j] 的值相等,因此限制 j < k
{
if(k==i||k==j)
continue;
if(vec[i]==vec[j]+vec[k])
{
++iResult;
//bFound = true;
//break; // 不能马上退出,因为后边的数也许会满足,如:0,0,0,0
}

}
//if(bFound)
//break;
}
}

return iResult;
}

int main()
{
int iGroups;
cin >> iGroups;
vector<int> vResult;
while(iGroups--)
{
int iNums;
cin >> iNums;
vector<int> vInt;
while(iNums--)
{
int i;
cin >> i;
vInt.push_back(i);
}
vResult.push_back(InnerSum(vInt));
}

for(size_t i=0;i<vResult.size();++i)
{
cout << vResult[i] << endl;
}
}

patricxuqi 2010-05-29
  • 打赏
  • 举报
回复
还真是20个啊
akonlbjrd 2010-05-29
  • 打赏
  • 举报
回复
刚好20。。
ming0753 2010-05-29
  • 打赏
  • 举报
回复
看看。。。。
ljm503097719 2010-05-29
  • 打赏
  • 举报
回复
支持下。。
昵称很不好取 2010-05-29
  • 打赏
  • 举报
回复
支持下
cattycat 2010-05-29
  • 打赏
  • 举报
回复
代码写的不错,很简洁。
cblcz 2010-05-29
  • 打赏
  • 举报
回复

#include <stdio.h>
int t;
int fun(int n,bool b)
{
if (b == true)
{
t = n;
if (n % 7 == 0)
return 0;
}
if (n <= 10)
return t;
else if (n % 10 == 7)
return 0;
else
return fun(n / 10,false);
}

int main()
{
int n;
scanf("%d",&n);
int s = 0;
for (int i = 1;i <= n;++i)
{
s = s + fun(i,true) * fun(i,true);
}
printf("%d",s);
return 0;
}


我写的第一题,WA了,帮忙看看哪错了
帅得不敢出门 2010-05-29
  • 打赏
  • 举报
回复
还有楼不?
wing_0706 2010-05-29
  • 打赏
  • 举报
回复
嘻嘻~~~
windsting 2010-05-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mstlq 的回复:]
关于第三题……
如果一行数据为
000111的话,那么输出应该是6……
请楼主检查自己代码是否能够得到这样的结果
[/Quote]

嗯,原来那个确实不能得到结果“6”,修改了一下,应该对了:
//C:和数查看
//描述
//给定一个整数序列,判断其中有多少个数,等于数列中其他两个数的和。
//比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。
//输入
//第一行是一个整数T,表示一共有多少组数据。 1<= T <= 100
//接下来的每组数据共两行,第一行是数列中数的个数n ( 1 <= n <= 100),第二行是由n个整数组成的数列。
//
//输出
//对于每组数据,输出一个整数(占一行),就是数列中等于其他两个数之和的数的个数。
//样例输入
//2
//4
//1 2 3 4
//5
//3 5 7 9 10
//样例输出
//2
//1


#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;

size_t InnerSum(vector<int>& vec)
{
sort(vec.begin(),vec.end());
size_t iResult=0;
for(size_t i=0;i<vec.size();++i)
{
for(size_t j=0;j<vec.size();++j)
{
if(j==i)
continue;
bool bFound=false;
for(size_t k=0;k<vec.size();++k)
{
if(k==i||k==j)
continue;
if(vec[i]==vec[j]+vec[k])
{
++iResult;
bFound = true;
break;
}

}
if(bFound)
break;
}
}

return iResult;
}

int main()
{
int iGroups;
cin >> iGroups;
vector<int> vResult;
while(iGroups--)
{
int iNums;
cin >> iNums;
vector<int> vInt;
while(iNums--)
{
int i;
cin >> i;
vInt.push_back(i);
}
vResult.push_back(InnerSum(vInt));
}

for(size_t i=0;i<vResult.size();++i)
{
cout << vResult[i] << endl;
}
}
加载更多回复(11)

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧