学习日记 | 菜鸟在xcode中学习c/c++
——1.11更新——
【浮点数输出】
Q1:输入只有一行,一个浮点数。保证数据合法,不存在整数位的前导零以及小数位的后导零。
题目解析:
计算机不能准确表示浮点数,这里要精确表示,采用字符串输出的形式。
参考答案:
int main(){
char buf[100];
gets(buf);
puts(buf);
return 0;
}
题目总结:
用get()
会出现警告,认为是不安全的。因为没有对输入的字符串做任何限制,可能会超出规定大小,使用时要小心。
——1.13更新——
【循环输出】
Q2:给出一个数n,求1到n中,有多少个数不是2、5、11、13的倍数。
要求:本题有多组输入.
参考答案:
#include<stdio.h>
#define ll long long
int main(){
ll n;
while(~scanf("%lld",&n))
{
ll ans1=n/2+n/5+n/11+n/13;//1~n中只是4个数中一个的倍数的数的总数
ll ans2=n/10+n/55+n/22+n/26+n/65+n/143;//1~n中是4个数中两个的倍数的数的总数
ll ans3=n/110+n/130+n/286+n/715;//1~n中是4个数中三个的倍数的数的总数
ll ans4=n/1430;//1~n中是4个数的倍数的数的总数
ll ans=ans1-ans2+ans3-ans4;//1~n中是2、5、11、13的倍数的数的总数
ll ANS=n-ans;//1~n中不是2、5、11、13的倍数的数的个数总数
printf("%lld\n",ANS);
}
return 0;
题目总结:
1.long long
占用8个字节,数据表示范围从int
的,升级到。
2.#define
是C指令,用于为各种数据类型定义别名,与typedef
类似,但是它们有以下几点不同:
-
typedef
仅限于为类型定影符号名称,#define
不仅可以为类型定义别名,也可以为数值定义别名,比如将1定义为ONE。
-
typedef
是由编译器执行解释的,#define
语句是由预编译器进行处理的。
3.C语言中while循环的语法为:
while(condition)
{
statement(s);
}
在这里condition
可以是任意的表达式,当为任意非零值使都为true
。当条件是true
时执行循环;当条件是false
时退出循环,程序流将继续执行紧接着循环的下一条语句。
此例中,条件是~scanf("%lld",&n)
,其中scanf()
的返回值情况为:如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回EOF
。而~
是取反运算符,按二进制位进行“取反”运算。当scanf("%lld",&n)
没有输入时,则返回EOF
,其值通常为-1。而-1按位取反为0。
4.解题中用到了数论和离散数学的知识:
- 1~n中能被5整除的个数即为n/5(取整)。
- 【离散数学-包含与排斥原理】
根据以下容斥原理 学习日记 | 菜鸟在xcode中学习c/c++
再imitate下面这个例题 学习日记 | 菜鸟在xcode中学习c/c++
即可得出代码中以下行
ll ans=ans1-ans2+ans3-ans4;//1~n中是2、5、11、13的倍数的数的总数
【解】ans是被2或5或11或13除尽的数的个数。
——1.30更新——
【函数调用】
Q1:对于传统的汉诺塔游戏我们做一个拓展,我们有从大到小放置的n个圆盘,开始时所有圆盘都放在左边的柱子上,按照汉诺塔游戏的要求我们要把所有的圆盘都移到右边的柱子上,请实现一个函数打印最优移动轨迹。
给定一个int n,表示有n个圆盘。请返回一个string数组,其中的元素依次为每次移动的描述。描述格式为: move from [left/mid/right] to [left/mid/right]。
参考答案:
class Hanoi {
public:
vector<string> getSolution(int n) {
std::vector<std::string> hnoi;
std::string a("left");
std::string b("mid");
std::string c("right");
GetHnoiString(hnoi, n, a, b, c);
return hnoi;
}
void GetHnoiString(std::vector<std::string>& hnoi, int n, std::string& a, std::string& b, std::string& c)
{
if (n == 1)
{
std::string tmp("move from ");
tmp += a;
tmp += " to ";
tmp += c;
hnoi.push_back(tmp);
}
else
{
GetHnoiString(hnoi, n - 1, a, c, b);
std::string tmp("move from ");
tmp += a;
tmp += " to ";
tmp += c;
hnoi.push_back(tmp);
GetHnoiString(hnoi, n - 1, b, a, c);
}
}
};
系统错误
1.Internal Error
2.增大字体
command键+