104 A == B ?
问题描述 :
给你两个非负实数A和B,如果A等于B,输出 "YES", 否则输出"NO"
输入说明 :
第一行N,表示有N组测试数据。
以下N行,每行两个非负实数 A和B。每个实数不超过1000位,且可能在前面和后面有0存在。
输出说明 :
对于每组测试数据,如果A和B相等则输出 "YES", 否则输出 "NO"。
每组测试数据占一行,两组测试数据之间无空行。行首与行尾均无空格。
输入范例 :
2
100.0 00100
0100.1234576 00000000100.123457
输出范例 :
YES
NO
思想:小数点前后的数字分别获取,小数点后的数把末尾的0除去,然后判断两个数是否都相等。
#include <stdio.h> #include <string.h> int main() { int i, j, k, l; int num; char s[1000]; scanf("%d", &num); for (l = 0; l < num; l++) { if (l == 0) { getchar(); //首行吸收一下换行符 } gets(s); int start1 = 0; // 1数非0的起始位置 int start2 = 0; // 2数非0的起始位置 int num1 = 0; // 1数整数部分 int num1s = 0; // 1数小数部分 int num2 = 0; // 2数整数部分 int num2s = 0; // 2数小数部分 int dot1 = 0; // 1数小数点 int dot2 = 0; // 2数小数点 for (i = 0; i < strlen(s); i++) { if (s[i] != ' ') //空格表示进入2数部分 { if (dot1 != 0)//进入小数部分 { num1s = num1s * 10 + s[i] - 48; } else if (start1) { if (s[i] == '.') { dot1 = i; } else { num1 = num1 * 10 + s[i] - 48; } } else { if (s[i] == '0') //未进入整数部分 前面的0舍去 { continue; } else { start1 = 1; num1 = num1 + s[i] - 48; } } } else { break; } } j = 0; for (i++; i < strlen(s); i++, j++) { if (dot2 != 0)//进入小数部分 { num2s = num2s * 10 + s[i] - 48; } else if (start2) { if (s[i] == '.') { dot2 = j; } else { num2 = num2 * 10 + s[i] - 48; } } else { if (s[i] == '0') //未进入整数部分 前面的0舍去 { continue; } else { start2 = 1; num2 = num2 + s[i] - 48; } } } while (num1s % 10 == 0 && num1s != 0) //由于是以整数保存的 除去小数部分的0,避免1.100和1.10后面保存的100和10不等的情况出现,都化成1再比较 { num1s /= 10; } while (num2s % 10 == 0 && num2s != 0) { num2s /= 10; } if (num1 == num2 && num1s == num2s) { printf("YES\n"); } else { printf("NO\n"); } } }