7.5.1
# include <stdio.h>
# include <math.h>
float fun ( float x, float a, float b, float c)
{
return a * pow ( x, 2 ) + b * x + c;
}
7.5.2
```c
# include <stdio.h>
# include <math.h>
void prn ( int m, int n) {
for ( int i = 0 ; i < m; i++ )
{
for ( int j = 0 ; j < n; j++ )
{
fputc ( 'A' + i, stdout ) ;
}
printf ( "\n" ) ;
}
}
7.6
long Gcd ( long num1, long num2)
{
if ( num1 < num2)
{
long temp = num1;
num1 = num2;
num2 = temp;
}
while ( num2 != 0 )
{
long temp = num2;
num2 = num1 % num2;
num1 = temp;
}
return num1;
}
long Lcm ( int num1, int num2)
{
return num1 / Gcd ( num1, num2) * num2;
}
7.7
# include <stdio.h>
# include <stdlib.h>
# include <limits.h>
unsigned long long fibonacci ( int n) ;
unsigned long long findClosestFibonacci ( unsigned long long x) ;
int main ( ) {
unsigned long long x;
printf ( "请输入一个正整数x: " ) ;
scanf_s ( "%llu" , & x) ;
unsigned long long result = findClosestFibonacci ( x) ;
printf ( "与%llu最接近的斐波那契数列中的值是: %llu\n" , x, result) ;
return 0 ;
}
unsigned long long fibonacci ( int n) {
if ( n <= 1 ) {
return n;
}
unsigned long long a = 0 , b = 1 , c;
for ( int i = 2 ; i <= n; i++ ) {
c = a + b;
a = b;
b = c;
}
return b;
}
unsigned long long findClosestFibonacci ( unsigned long long x) {
unsigned long long closest = 0 ;
unsigned long long diff = ULLONG_MAX;
int n = 0 ;
while ( 1 ) {
unsigned long long fib = fibonacci ( n) ;
unsigned long long currentDiff = ( fib > x) ? ( fib - x) : ( x - fib) ;
if ( currentDiff < diff) {
diff = currentDiff;
closest = fib;
}
if ( fib == x || fib > x && ( fib - x) > diff) {
break ;
}
n++ ;
}
return closest;
}
7.8
# include <stdio.h>
# include <stdlib.h>
# include <ctype.h>
# include <string.h>
# define MAX_SIZE 100
int precedence ( char op) {
if ( op == '+' || op == '-' )
return 1 ;
if ( op == '*' || op == '/' )
return 2 ;
return 0 ;
}
int applyOp ( int a, int b, char op) {
switch ( op) {
case '+' : return a + b;
case '-' : return a - b;
case '*' : return a * b;
case '/' : return a / b;
}
return 0 ;
}
int evaluate ( char * tokens[ ] , int size) {
int values[ MAX_SIZE] ;
char ops[ MAX_SIZE] ;
int valTop = - 1 ;
int opsTop = - 1 ;
for ( int i = 0 ; i < size; i++ ) {
while ( isspace ( tokens[ i] [ 0 ] ) ) {
tokens[ i] ++ ;
}
if ( isdigit ( tokens[ i] [ 0 ] ) ) {
values[ ++ valTop] = atoi ( tokens[ i] ) ;
}
else {
while ( opsTop != - 1 && precedence ( ops[ opsTop] ) >= precedence ( tokens[ i] [ 0 ] ) ) {
int val2 = values[ valTop-- ] ;
int val1 = values[ valTop-- ] ;
char op = ops[ opsTop-- ] ;
values[ ++ valTop] = applyOp ( val1, val2, op) ;
}
ops[ ++ opsTop] = tokens[ i] [ 0 ] ;
}
}
while ( opsTop != - 1 ) {
int val2 = values[ valTop-- ] ;
int val1 = values[ valTop-- ] ;
char op = ops[ opsTop-- ] ;
values[ ++ valTop] = applyOp ( val1, val2, op) ;
}
return values[ valTop] ;
}
void tokenize ( char * expr, char tokens[ ] [ MAX_SIZE] , int * size) {
int count = 0 ;
char * token = strtok ( expr, " " ) ;
while ( token != NULL ) {
strcpy ( tokens[ count++ ] , token) ;
token = strtok ( NULL , " " ) ;
}
* size = count;
}
int main ( ) {
char expr[ MAX_SIZE] ;
char tokens[ MAX_SIZE] [ MAX_SIZE] ;
int size;
printf ( "请输入一个不含括号的四则运算表达式: " ) ;
fgets ( expr, MAX_SIZE, stdin ) ;
expr[ strcspn ( expr, "\n" ) ] = 0 ;
tokenize ( expr, tokens, & size) ;
int result = evaluate ( tokens, size) ;
printf ( "结果是: %d\n" , result) ;
return 0 ;
}
7.9 使用有限状态机(FSM)的方法
# include <stdio.h>
# include <ctype.h>
# include <stdbool.h>
# include <string.h>
typedef enum {
START,
AFTER_OPERAND,
AFTER_OPERATOR,
END
} State;
bool isValidOperator ( char c) {
return c == '+' || c == '-' || c == '*' || c == '/' ;
}
bool isValidDigit ( char c) {
return isdigit ( c) ;
}
void checkExpression ( const char * expr) {
State currentState = START;
bool operandFound = false;
bool operatorFound = false;
const char * errorPos = NULL ;
for ( int i = 0 ; expr[ i] != '\0' ; i++ ) {
char c = expr[ i] ;
if ( isspace ( c) ) {
continue ;
}
switch ( currentState) {
case START:
if ( isValidDigit ( c) ) {
currentState = AFTER_OPERAND;
operandFound = true;
} else if ( isValidOperator ( c) ) {
currentState = AFTER_OPERATOR;
operatorFound = true;
errorPos = & expr[ i] ;
} else {
printf ( "表达式错误:在位置 %d 处遇到无效字符 '%c',原因是操作数不匹配。\n" , i, c) ;
return ;
}
break ;
case AFTER_OPERAND:
if ( isValidOperator ( c) ) {
currentState = AFTER_OPERATOR;
operatorFound = true;
operandFound = false;
} else if ( isValidDigit ( c) ) {
} else {
printf ( "表达式错误:在位置 %d 处遇到无效字符 '%c',原因是操作数不匹配。\n" , i, c) ;
return ;
}
break ;
case AFTER_OPERATOR:
if ( isValidDigit ( c) ) {
currentState = AFTER_OPERAND;
operandFound = true;
} else {
printf ( "表达式错误:在位置 %d 处遇到无效字符 '%c',原因是操作符不匹配。\n" , i, c) ;
return ;
}
break ;
case END:
printf ( "表达式错误:表达式以非法方式结束。\n" ) ;
return ;
}
}
if ( currentState == AFTER_OPERATOR && ! operandFound) {
if ( errorPos) {
printf ( "表达式错误:在位置 %ld 处操作符后缺少操作数,原因是操作数不匹配。\n" , errorPos - expr) ;
} else {
printf ( "表达式错误:表达式以操作符结束,原因是操作数不匹配。\n" ) ;
}
} else if ( ( currentState == START || currentState == AFTER_OPERATOR) && ! operatorFound && operandFound) {
printf ( "表达式错误:表达式中缺少操作符,可能是操作符不匹配或表达式不完整。\n" ) ;
} else if ( currentState == AFTER_OPERAND) {
printf ( "表达式合法,但可能不完整(以操作数结束)。\n" ) ;
} else {
printf ( "表达式合法。\n" ) ;
}
}
int main ( ) {
char expr[ 100 ] ;
printf ( "请输入一个简单四则运算表达式:" ) ;
fgets ( expr, sizeof ( expr) , stdin ) ;
expr[ strcspn ( expr, "\n" ) ] = 0 ;
checkExpression ( expr) ;
return 0 ;
}
7.10
# include <stdio.h>
# include <stdlib.h>
# include <stdbool.h>
# include <time.h>
bool isValidDate ( int year, int month, int day) {
struct tm date = { 0 } ;
date. tm_year = year - 1900 ;
date. tm_mon = month - 1 ;
date. tm_mday = day;
time_t time_check = mktime ( & date) ;
struct tm * timeinfo = localtime ( & time_check) ;
return ( timeinfo-> tm_year == date. tm_year &&
timeinfo-> tm_mon == date. tm_mon &&
timeinfo-> tm_mday == date. tm_mday) ;
}
int daysBetweenDates ( struct tm * startDate, struct tm * endDate) {
time_t start = mktime ( startDate) ;
time_t end = mktime ( endDate) ;
double difference = difftime ( end, start) / ( 60 * 60 * 24 ) ;
return ( int ) difference;
}
int daysToNextBirthday ( struct tm birthDate, struct tm currentDate) {
struct tm nextBirthday = currentDate;
nextBirthday. tm_year += ( currentDate. tm_mon < birthDate. tm_mon ||
( currentDate. tm_mon == birthDate. tm_mon && currentDate. tm_mday < birthDate. tm_mday) ) ? 1 : 0 ;
nextBirthday. tm_mon = birthDate. tm_mon;
nextBirthday. tm_mday = birthDate. tm_mday;
if ( currentDate. tm_mon == birthDate. tm_mon && currentDate. tm_mday == birthDate. tm_mday &&
currentDate. tm_hour < 24 && currentDate. tm_min < 60 && currentDate. tm_sec < 60 ) {
nextBirthday. tm_year += 1 ;
}
return daysBetweenDates ( & currentDate, & nextBirthday) ;
}
int main ( ) {
int birthYear, birthMonth, birthDay;
int currentYear, currentMonth, currentDay;
while ( true) {
printf ( "请输入出生年份 (yyyy): " ) ;
scanf ( "%d" , & birthYear) ;
printf ( "请输入出生月份 (mm): " ) ;
scanf ( "%d" , & birthMonth) ;
printf ( "请输入出生日期 (dd): " ) ;
scanf ( "%d" , & birthDay) ;
struct tm birthDate = { 0 } ;
birthDate. tm_year = birthYear - 1900 ;
birthDate. tm_mon = birthMonth - 1 ;
birthDate. tm_mday = birthDay;
if ( isValidDate ( birthYear, birthMonth, birthDay) ) {
break ;
} else {
printf ( "无效的日期,请重新输入。\n" ) ;
}
}
time_t now = time ( NULL ) ;
struct tm * currentDate = localtime ( & now) ;
currentYear = currentDate-> tm_year + 1900 ;
currentMonth = currentDate-> tm_mon + 1 ;
currentDay = currentDate-> tm_mday;
int age = currentDate-> tm_year - birthDate. tm_year;
if ( currentDate-> tm_mon < birthDate. tm_mon ||
( currentDate-> tm_mon == birthDate. tm_mon && currentDate-> tm_mday < birthDate. tm_mday) ) {
age-- ;
}
int daysToBirthday = daysToNextBirthday ( birthDate, * currentDate) ;
printf ( "年龄(周岁): %d\n" , age) ;
printf ( "距离下一次生日的天数: %d\n" , daysToBirthday) ;
return 0 ;
}
7.14
# include <stdio.h>
# include <stdbool.h>
# include <math.h>
bool isPrime ( int num) {
if ( num <= 1 ) {
return false;
}
for ( int i = 2 ; i <= sqrt ( num) ; i++ ) {
if ( num % i == 0 ) {
return false;
}
}
return true;
}
int largestPrimeFactor ( int n) {
int maxPrime = - 1 ;
for ( int i = ( int ) sqrt ( n) ; i >= 2 ; i-- ) {
if ( n % i == 0 && isPrime ( i) ) {
maxPrime = i;
while ( n % i == 0 ) {
n /= i;
}
}
}
if ( n > 1 ) {
maxPrime = n;
}
return maxPrime;
}
int main ( ) {
int num;
printf ( "请输入一个正整数: " ) ;
scanf ( "%d" , & num) ;
if ( num <= 0 ) {
printf ( "请输入一个正整数。\n" ) ;
return 1 ;
}
int largestPrime = largestPrimeFactor ( num) ;
printf ( "最大素数因子: %d\n" , largestPrime) ;
return 0 ;
}
7.15
# include <stdio.h>
# include <math.h>
bool isNarcissisticNumber ( int num) {
int originalNum, remainder, result = 0 , n = 0 ;
originalNum = num;
while ( originalNum != 0 ) {
originalNum /= 10 ;
n++ ;
}
originalNum = num;
while ( originalNum != 0 ) {
remainder = originalNum % 10 ;
result += pow ( remainder, n) ;
originalNum /= 10 ;
}
return ( result == num) ;
}
7.16
bool isPerfectNumber ( int num) {
int sum = 0 ;
for ( int i = 1 ; i <= num / 2 ; i++ ) {
if ( num % i == 0 ) {
sum += i;
}
}
return ( sum == num) ;
}
7.17
int POWER_INTEGER ( int x, int n) {
int pow = 1 ;
while ( n > 0 )
{
if ( n % 2 == 1 )
{
pow *= x;
}
x *= x;
n = n / 2 ;
}
return pow;
}
7.18
long powerInteger ( int base, int exponent) {
if ( exponent == 0 ) {
return 1 ;
}
else {
return base * powerInteger ( base, exponent - 1 ) ;
}
}
7.19
long Gcd ( long num1, long num2) {
if ( num1 < num2)
{
long temp = num1;
num1 = num2;
num2 = temp;
}
while ( num2 != 0 )
{
long tmp = num2;
num2 = num1 % num2;
num1 = tmp;
}
return num1;
}
7.20
# include <stdio.h>
# include <stdlib.h>
int digit ( int n, int j) {
switch ( j) {
case 1 :
return n % 10 ;
case 2 :
return ( n / 10 ) % 10 ;
case 3 :
return ( n / 100 ) % 10 ;
case 4 :
return ( n / 1000 ) % 10 ;
case 5 :
return ( n / 10000 ) % 10 ;
case 6 :
return ( n / 100000 ) % 10 ;
case 7 :
return ( n / 1000000 ) % 10 ;
case 8 :
return ( n / 10000000 ) % 10 ;
case 9 :
return ( n / 100000000 ) % 10 ;
default :
return 0 ;
}
}
int main ( ) {
int n, j;
printf ( "请输入n和j: " ) ;
scanf_s ( "%d %d" , & n, & j) ;
printf ( "数字%d 的倒数第 %d 位为:%d\n" , n, j, digit ( n, j) ) ;
return 0 ;
}