#include <stdio.h>
int main()
{
int n = 0, t;
for (t=0; t<=20*7; t++)
{
if (t%5 == 0 && t <= 20*5) /* 控制A舰每隔5秒放1次 */
{
n++;
continue; /* 继续下一次循环 */
}
if ( t%6 == 0 && t <= 20*6) /* 控制B舰每隔6秒放1次 */
{
n++;
continue; /* 继续下一次循环 */
}
if (t%7 == 0) /* 控制C舰每隔7秒放1次 */
{
n++;
}
}
printf("n = %d\n", n);
}
这段程序代码含有代码错误。
1.程序代码修改
#include<stdio.h>
int main()
{
double x1,x2,x3,y1,y2,y3,ab,ac,bc,flag=0;
scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3); //输入三角形的三个顶点值
ab=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);//关于防止出现误差可以直接在代码中的常数中加上一个小数点点,如:(1.0/3)。注意此处求两点之间距离要我们要讲sqrt包裹这个差值
ac=(x1-x3)*(x1-x3)+(y1-y3)*(y1-y3);
bc=(x2-x3)*(x2-x3)+(y2-y3)*(y2-y3);
// 判断三角形的方案是否合法有效
if((ab==bc)||(ab==ac)||(ac==bc))
{
if((y3-y1)*(x2-x1)!=(y2-y1)*(x3-x1))
{
flag=1;
}
}
if(flag)
{
printf("yes");
}
else
{
printf("no");
}
return 0;
}
原来程序代码中没有对bc的取值操作,此是将ab==bc修改成bc==(x2-x3)(x2-x3)+(y2-y3)(y2-y3)。但是从编写思路上,我们应该将每次产生的取值保存下来,避免因取值操作带来精度误差。这种处理对于程序处理的精度优化是非常重要的。
我们可以对变量bc进行计算,避免直接进行值之间的比较。bc=(x2-x3)(x2-x3)+(y2-y3)(y2-y3) 可以将ab 的值进行输出,观察其是否等于435。如果输出达不到预期的结果,后面有几个长表达式也有可能存在错误。下面的代码是对于修正后、测试后的结果:
#include<stdio.h>
int main()
{
double x1,x2,x3,y1,y2,y3,ab,ac,bc,flag=0;
scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3); //输入三角形的三个顶点值
ab=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);//关于防止出现误差可以直接在代码中的常数中加上一个小数点点,如:(1.0/3)。注意此处求两点之间距离要我们要讲sqrt包裹这个差值
ac=(x1-x3)*(x1-x3)+(y1-y3)*(y1-y3);
bc=(x2-x3)*(x2-x3)+(y2-y3)*(y2-y3);
printf("ab:%lf\nbc:%lf\nc:%lf\n", ab,bc,ac);
// 判断三角形的方案是否合法有效
if((ab==bc)||(ab==ac)||(ac==bc))
{
if((y3-y1)*(x2-x1)!=(y2-y1)*(x3-x1))
{
flag=1;
}
}
if(flag)
{
printf("yes");
}
else
{
printf("no");
}
return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Node { //链表结构体定义
int data;
Node* next;
};
Node* Merge(Node* a, Node* b) { //尝试将两个单链表合并
Node* head = new Node();
Node* tmp = head;
while (a != nullptr && b != nullptr) {
if (a->data < b->data) {
tmp->next = a;
a = a->next;
}
else {
tmp->next = b;
b = b->next;
}
tmp = tmp->next;
}
if (a == nullptr) {
tmp->next = b;
}
if (b == nullptr) {
tmp->next = a;
}
return head->next;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
int n,m;
scanf("%d%d",&n,&m);
Node* a = new Node(),* b = new Node();
Node* tmp = a;
for(int i=1;i<=n;i++) {
int x;
scanf("%d",&x);
tmp->next = new Node();
tmp->next->data = x;
tmp->next->next = nullptr;
tmp = tmp->next;
}
tmp = b;
for(int i=1;i<=m;i++) {
int x;
scanf("%d",&x);
tmp->next = new Node();
tmp->next->data = x;
tmp->next->next = nullptr;
tmp = tmp->next;
}
a = a->next;
b = b->next;
Node* c = Merge(a,b);
while(c != nullptr) {
printf("%d ",c->data);
c = c->next;
}
printf("\n");
}
return 0;
}
此题是经典的汉诺塔,并不属于编程领域,不作讨论。如有使用需要可以参考下面的代码实现。
#include <stdio.h>
void move(int, char, char, char);
int num = 1;//记录次数
int main(){
int n;
printf("请输入圆环数:");
scanf_s("%d", &n);
move(n, 'A', 'B', 'C');
return 0;
}
/*
步骤1:将A柱子上 P_{1}.........P_{n-1}以某种方法全部放到B柱子上(此时A柱子只有 P_{n},middle柱子上有 P_{1}........P_{n-1},而C(end)柱子上没有盘子)
步骤2:将柱子上仅存的 P_{n}挪到空无一物的C柱子上。
步骤3:将B柱子上剩余的 P_{1}......P_{n-1}全部挪到C柱子上。
*/
//从A到C那B是缓冲区
void move(int n, char a, char b, char c){
if (n == 1) {
printf("第%d步:%c-->%c\n", num, a, c);
num++;
} else {
move(n - 1, a, c, b);//从A到B那C是缓冲区
printf("第%d步:%c-->%c\n", num, a, c);
num++;
move(n - 1, b, a, c);//从B到C那A是缓冲区
}
}
因为f函数用的不是指针,无论怎么修改x y都不会改变主程序的abc
具体分析在我另一个回答里详细说明了,这里不赘述。